字典
>>> {} # 空字典
{}
>>> {"a":1, "b":2} # 普通构造方式
{'a': 1, 'b': 2}
>>> dict(a = 1, b = 2) # 构造
{'a': 1, 'b': 2}
>>> dict((["a", 1], ["b", 2])) # 用两个序列类型构造字典。
{'a': 1, 'b': 2}
>>> dict(zip("ab", range(2))) # 同上
{'a': 0, 'b': 1}
>>> dict(map(None, "abc", range(2))) # 同上
{'a': 0, 'c': None, 'b': 1}
>>> dict.fromkeys("abc", 1) #用序列做 key,并提供默认 value。
{'a': 1, 'c': 1, 'b': 1}
>>> {k:v for k, v in zip("abc", range(3))} # 使用生成表达式构造字典。
{'a': 0, 'c': 2, 'b': 1}
基本操作
>>> d = {"a":1, "b":2}
>>> "b" in d # 判断是否包含 key。
True
>>> d = {"a":1, "b":2}
>>> del d["b"] # 删除 k/v。
>>> d
{'a': 1}
>>> d = {"a":1}
>>> d.update({"c": 3}) # 合并 dict。
>>> d
{'a': 1, 'c': 3}
>>> d = {"a":1, "b":2}
>>> d.pop("b") # 弹出 value。
>>> d
(2, {'a': 1})
>>> d = {"a":1, "b":2}
>>> d.popitem() # 弹出 (key, value)。
('a', 1)
>>> d = {"a":1, "b":2}
>>> d.get("c") # 如果没有对应 key,返回 None。
None
>>> d.get("d", 123) # 如果没有对应 key,返回缺省值。
123
>>> d.setdefault("a", 100) # key 存在,直接返回 value。
1
>>> d.setdefault("c", 200) # key 不存在,先设置,后返回。
200
>>> d
{'a': 1, 'c': 200, 'b': 2}
>>> d = {"a":1, "b":2}
>>> d.keys() #不建议使用,大的字典会造成巨大的列表
['a', 'b']
>>> d.values()
[1, 2]
>>> d.items()
[('a', 1), ('b', 2)]
>>> for k in d: print k, d[k]
a 1
b 2
>>> for k, v in d.items(): print k, v
a 1
b 2
>>> d = {"a":1, "b":2}
>>> d.iterkeys()
<dictionary-keyiterator object at 0x10de82cb0>
>>> d.itervalues()
<dictionary-valueiterator object at 0x10de82d08>
>>> d.iteritems()
<dictionary-itemiterator object at 0x10de82d60>
>>> for k, v in d.iteritems():
... print k, v
a 1
b 2
视图
>>> d1 = dict(a = 1, b = 2)
>>> d2 = dict(b = 2, c = 3)
>>> d1 & d2 # 字典不⽀支持该操作。
TypeError: unsupported operand type(s) for &: 'dict' and 'dict'
>>> v1 = d1.viewitems()
>>> v2 = d2.viewitems()
>>> v1 & v2 # 交集
set([('b', 2)])
>>> v1 | v2 # 并集
set([('a', 1), ('b', 2), ('c', 3)])
>>> v1 - v2 # 差集 (仅 v1 有,v2 没有的)
set([('a', 1)])
>>> v1 ^ v2 # 对称差集 (不会同时出现在 v1 和 v2 中)
set([('a', 1), ('c', 3)])
>>> ('a', 1) in v1 # 判断
True
视图让某些操作变得更加简便,比如在不引入新数据项的情况下更新字典内容
>>> a = dict(x=1)
>>> b = dict(x=10, y=20)
>>> a.update({k:b[k] for k in a.viewkeys() & b.viewkeys()})
>>> a
{'x': 10}
视图会和字典同步变更
>>> d = {"a": 1}
>>> v = d.viewitems()
>>> v
dict_items([('a', 1)])
>>> d["b"] = 2
>>> v
dict_items([('a', 1), ('b', 2)])
>>> del d["a"]
>>> v
dict_items([('b', 2)])
当访问的 key 不存在时, defaultdict 自动调用 factory 对象创建所需键值对。factory 可以是任
何无参数函数或 callable 对象
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d["a"].append(1) # key "a" 不存在,直接用 list() 函数创建一个空列表作为 value。
>>> d["a"].append(2)
>>> d["a"]
[1, 2]
扩展
当访问的 key 不存在时, defaultdict 自动调用 factory 对象创建所需键值对。factory 可以是任
何无参数函数或 callable 对象
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d["a"].append(1) # key "a" 不存在,直接用 list() 函数创建一个空列表作为 value。
>>> d["a"].append(2)
>>> d["a"]
[1, 2]
有序输出
字典是哈希表,默认迭代是无序的。如果希望按照元素添加顺序输出结果,可以用 OrderedDict
>>> from collections import OrderedDict
>>> d = dict()
>>> d["a"] = 1
>>> d["b"] = 2
>>> d["c"] = 3
>>> for k, v in d.items(): print k, v # 并非按添加顺序输出。
a 1
c 3
b 2
>>> od = OrderedDict()
>>> od["a"] = 1
>>> od["b"] = 2
>>> od["c"] = 3
>>> for k, v in od.items(): print k, v # 按添加顺序输出。
a 1
b 2
c 3
>>> od.popitem() # 按 LIFO 顺序弹出。
('c', 3)
>>> od.popitem()
('b', 2)
>>> od.popitem()
('a', 1)