python 专题十四 字典

字典

>>> {}      # 空字典
{}
>>> {"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)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值