Python基础与拾遗4:Python中的字典
本篇博文,主要总结Python中的字典及相关操作,下面开始干货。
字典相关定义
- 字典是任意对象的无序集合。
a = {"a": 1, "b": [1, 2, 3], 3: 2} # {'a': 1, 'b': [1, 2, 3], 3: 2}
- 字典通过键而不是通过索引进行读取。字典又叫关联数组或者散列表,索引采取键的形式。如果要采用类似所用的方式,请将实数作为键,如下例所示。
a = {"a": 1, "b": [1, 2, 3], 3: 2}
a["a"] # 1
a[0] # KeyError: 0
a[3] # 2
- 字典可在原处增长或缩短,异构,任意深度嵌套。
a = {"a": 1, "b": [1, 2, 3], 3: 2}
a["c"] = (4, 5, 6) # {'a': 1, 'b': [1, 2, 3], 3: 2, 'c': (4, 5, 6)}
del a["a"] # {'b': [1, 2, 3], 3: 2, 'c': (4, 5, 6)}
b = {"dic": a, "list": [1, 2, 3], "str": "hello"} # {'dic': {'b': [1, 2, 3], 3: 2, 'c': (4, 5, 6)}, 'list': [1, 2, 3], 'str': 'hello'}
- 字典属于可变映射类型。字典可以在原处修改,但是不能进行合并与分片操作,是唯一的映射类型。
a = {"a": 1, "b": [1, 2, 3], 3: 2}
a["a"] += 10 # {'a': 11, 'b': [1, 2, 3], 3: 2}
- 字典是对象引用表,存储的是对象的引用,Python会用最优化的散列算法寻找键。
字典相关操作
操作 | 解释 |
---|---|
D={} | 空字典 |
D={‘spam’:2, ‘eggs’:3} | 两项目字典 |
D={‘food’: {‘ham’:1, ‘eggs’:2}} | 字典嵌套 |
D=dict.fromkeys([‘a’,‘b’]) | fromkeys方法构造字典 |
D=dict(zip(keylist, vallist)) | 映射构造字典 |
D=dict(name=‘Bob’, ‘age’=42) | 键值对构造字典 |
D[‘eggs’] | 以键为索引进行查找 |
D[‘food’][‘ham’] | 按键索引中按键索引 |
‘eggs’ in D | 键是否存在 |
D.keys() | 返回键列表 |
D.values() | 返回值列表 |
D.items() | 返回键值对列表 |
D.copy() | 复制字典 |
D.get(key, default) | 返回指定键的值,如果不存在就返回default |
D.update(D2) | 字典合并 |
D.pop(key) | 按键删除 |
len(D) | 返回长度 |
D[key]=42 | 新增键值对 |
del D[key] | 根据键删除条目 |
list(D.keys()) | 返回键列表Python 3.0及之后的版本中 |
D1.keys() & D2.keys() | 两个字典的键求交集 |
D = {x: x*2 for x in range(10)} | 字典解析 |
- keys,values和items返回键,值和键值对,在Python 3.0及之后的版本中,可使用list()将其转换为列表。
a = {'a': 11, 'b': [1, 2, 3], 3: 2}
list(a.keys()) # ['a', 'b', 3]
list(a.values()) # [11, [1, 2, 3], 2]
list(a.items()) # [('a', 11), ('b', [1, 2, 3]), (3, 2)]
- update合并字典,将一个字典的值覆盖到另一个字典中,并覆盖重复的值。
a = {'a': 11, 'b': [1, 2, 3], 3: 2}
b = {'a': 22, 'c': ['a', 'b', 'c']}
a.update(b) # {'a': 22, 'b': [1, 2, 3], 3: 2, 'c': ['a', 'b', 'c']}
- pop会删除一个键并返回键的值。
a = {'a': 11, 'b': [1, 2, 3], 3: 2}
a.pop('a') # 返回11,现在a为{'b': [1, 2, 3], 3: 2}
- 分片与合并在字典中无效。
a = {'a': 11, 'b': [1, 2, 3], 3: 2}
b = {'a': 22, 'c': ['a', 'b', 'c']}
a + b # TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
a[0] # KeyError: 0
如何避免missing-key错误
- 使用if语句进行判断。
a = {'a': 11, 'b': [1, 2, 3], 3: 2}
if 'b' in a:
print(a['b']) # [1, 2, 3]
if 'c' in a:
print(a['c']) # 无输出
- 使用try/except语句。
a = {'a': 11, 'b': [1, 2, 3], 3: 2}
try:
print(a['c'])
except KeyError:
pass
- 使用get方法,返回默认值。
a.get('c', 0) # 返回0
创建字典的方法
- 直接创建。
a={'a': 1, 'b': 2}
- 给空字典赋值。
a={}
a['a']=1
a['b']=2
- dict函数。
a=dict([('a', 'b'),(1,2)])
- 如果所有的键的值相同,可以用fromkeys方法。
a=dict.fromkeys(['a', 'b'], 0) # {'a': 0, 'b': 0}
- 在Python 3.0及之后的版本中,可以使用字典解析。
a={k:v for (k,v) in zip(['a', 'b'],[1,2])} # {'a': 1, 'b': 2}
Python 3.0及之后的版本中的字典变化
- 新增字典解析功能,可用于创建字典,见上面的例子。
- 对D.key(),D.values(),D.items()方法返回可迭代的视图,而不是列表,通过list()生成列表,见上面的例子。
- 需要排序字典键的话,通过排序生成的列表,而不能排序视图。
a = {'a': 11, 'b': [1, 2, 3], 'c': 2}
key_list = list(a.keys())
sorted(key_list) # ['a', 'b', 'c']
- 不支持直接用<或者>比较字典,可以比较排序后的D.items()列表,但是可以使用==符号。
a = {'a': 11, 'b': [1, 2, 3], 'c': 2}
b = {'d': 11, 'c': [1, 2, 3], 'a': 2}
sorted(a.items()) < sorted(b.items()) # False
a < b # TypeError: '<' not supported between instances of 'dict' and 'dict'
a == b # False
- has_key方法被取消,取而代之的是in。
a = {'a': 11, 'b': [1, 2, 3], 'c': 2}
a.has_key('a') # AttributeError: 'dict' object has no attribute 'has_key'
'a' in a # True
以上,欢迎各位读者朋友提出意见或建议。
欢迎阅读笔者后续博客,各位读者朋友的支持与鼓励是我最大的动力!
written by jiong
放弃幻想,
准备斗争!