- 提供 copy 成员函数
- 内部有
__len__
,故可通过 len() 获得一个字典的长度;
0. D.get(k[,d]) vs D.setdefault()
D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
- d.get(‘monkey’, ‘N/A’):不存在的key,默认返回为 N/A
D.get(k[,d]) 该函数的含义不仅像 D[k] 一样,取出键为 k 时的 value,还在于当 k not in D 时,指定一个默认值,从而避免 KeyError,而使程序中断。
(1)使用 setdefault() 指定初值
def histogram(values, mode=0): bins = {} for v in values: bins.setdefault(v, 0) bins[v] += 1 if mode: return sorted(bins.values(), key=lambda x: (x[1], x[0]), reverse=True) return sorted(bins.values())
(2)使用 get() 指定初值
def histogram(values, mode=0): bins = {} for v in values: bins[v] = bins.get(v, 0) + 1 if mode: return sorted(bins.values(), key=lambda x: (x[1], x[0]), reverse=True) return sorted(bins.values())
1. 多样的构造函数
使用关键字参数:
>>> dict(initial=5, taps=[-2, -1]) {'initial': 5, 'taps': [-2, -1]}
fromkeys
>>> seq = ('name', 'age', 'sex') >>> d = dict.fromkeys(seq) >>> d {'age': None, 'name': None, 'sex': None} >>> seq = ('apple', 'banana', 'orange') >>> d = dict.fromkeys(seq, 10.5) # 统一指定初值 >>> d {'apple': 10.5, 'banana': 10.5, 'orange': 10.5}
2. 遍历
>>> d = dict(initial=5, taps=[-2, -1])
>>> for i in d: # 等价于 for k in d.keys()
print(i)
>>> for k, v in d.items():
print(k+':', v)
3. 索引一个不存在的键,并赋值,即是添加
如果直接索引一个不存在的键,则会报KeyError
;
>>> t = [('zch', 24), ('lx', 24), ('whb', 25)]
>>> d = {k:v for k,v in t}
>>> d
{'lx': 24, 'whb': 25, 'zch': 24}
>>> d['lxw'] = 25
>>> d
{'lx': 24, 'lxw': 25, 'whb': 25, 'zch': 24}
4. dict.setdefault():字典元素的初始化
既然是初始化,只执行一次,无论被调用多次。
其实也可替换为 if 判断 + 初始化:
d.setdeault(key, 0)
等价于:
if key not in d:
d[key] = 0
5. 字典无序
>>> d = {'zhang':23, 'li':23}
>>> d[0]
KeyError: 0
字典无序,所以 d[0]
,会报 KeyError。
之所以无序,是因为字典里元素的顺序并不重要,这也是为什么字典这一数据结构使用用来表示集合(集合只关心其中的内容,自然与顺序无关)的大括号(
{}
{
}
)的原因;
6. 字典的键和值均可为非基本数据类型之外的,比如元组或者list
>>> m = {}
>>> m[(0, 0)] = [1, 1]
# 索引一个无的,不会报KeyError,
# 而是进行键值pair的添加
一大应用实例在于 从0-1背包问题到动态规划
def fastMaxVal(i, w, v, c, m):
try:
return m[(i, c)]
except KeyError:
if i == 0:
if w[i] <= c:
m[(i, c)] = v[i]
return v[i]
m[(i, c)] = 0
return 0
without_i = fastMaxVal(i-1, w, v, c, m)
if w[i] > c:
m[(i, c)] = without_i
return m[(i, c)]
with_i = v[i] + fastMaxVal(i-1, w, v, c-w[i], m)
m[(i, c)] = max(without_i, with_i)
return m[(i, c)]
7. 字典的一些典型应用实例
除了上文的以tuple
为键(因为要保存二元元组对应的value值)的字典,还有一般的以基本数据类型为类型的键值对,比如在斐波那契的动态规划版中 从0-1背包问题到动态规划 :
def fib(n, m):
if n not in m:
m[n] = fib(n-1, m) + fib(n-2, m)
return m[n]
我们会看到这两大应用均是为大名鼎鼎的动态规划的memo(lookup table)提供数据结构支持。