字典是Python中的一个重要操作,如果字典玩得顺,很多其他的数据类型就可以一通百通。
字典使用一对大括号进行定义,键值对之间使用逗号隔开,键和值使用冒号分隔。
键必须是不可变类型,一般使用字符串,数字,和元组也可以但用的不多。
值可以是任意数据类型。
>>> a = {} # 空字典 >>> b = { 'name': '九柄', 'age': 18, 'hobby': ['运动', 'meizi'], 'friends': [ {'name': '刘德华'}, {'name': '张学友'} ] } >>> print(type(a)) < class 'dict' > >>> print(type(b)) < class 'dict' >
字典的基本操作分为:增、删、改、查。
字典通过键作为索引来获取对应的值。
>>> b = { 'name': '心蓝', 'age': 18, 'hobby': ['运动', 'meizi'], 'friends': [ {'name': '刘德华'}, {'name': '张学友'} ] } >>> print(b['name']) '心蓝' >>> print(b['hobby'][-1]) 'meizi'
这种方式很好的将键和值联系起来,就像查字典一样。
如果想判断某个 key 是不是已经存在,可以直接使用 in
来判断:
print("name" in b)
关于 Python 字典的键,始终需要注意的是:
列表是可变的数据类型,所以不能作为字典的键。 同样的,字典,集合这一类的可变数据类型都不能作为字典的键。
元组是不可变的,可以作为字典的键。
同样的,字符串、整型、浮点数、布尔值都是不可变的,所以都可以作为字典的键。
既然字典的键不能重复,那值可以重复吗?
答案是可以的,字典的值几乎不会做任何限制,你可以存储任何的数据类型,任何的数据值。
不同的键对应相同的值,完全是合理的:
a = { "my_name": "jiubing", "your_name": "jiubing" }
取值最经典对的方法是通过中括号取值。
>>> d = {'name': '九柄', 'age': 18} >>> d["name"] 九柄
但这种方式有个弊端,当取的 key 不存在时,会报错。 比如我取一个 hobby ,因为不存在,会触发 keyerror 错误。
Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'keyerror'
为了避免这种情况,我比较习惯用 get 方法,当 key 不存在的时候,可以指定一个默认值 None, 不会引发错误。
d = {'name': '九柄', 'age': 18} d.get("hobby", None)
字典添加元素和修改元素的语法是一样的。
如果键不存在,则添加元素。
>>> d = {'name':'九柄'} >>> d['age'] = 18 >>> print(d) {'name': '九柄', 'age': 18}
如果键存在则修改字典
>>> d = {'name': '九柄'} >>> d['name'] = 'jiubing' >>> print(d) {'name': 'jiubing'}
pop(key[,d])
删除指定的键对应的值,并返回该值,如果键不存在则返回默认值d
,如果没有给定d
,则抛出异常
>>> d = {'name': 'jiubing', 'age': 18} >>> d.pop('age') >>> print(d) {'name': 'jiubing'} >>> d.pop('age') Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'age' >>> d.pop('age', -1) -1
.popitem()
任意删除字典中的一个键值对,并以二元元组(key,value)
的形式返回
>>> d = {'name': 'jiubing', 'age': 18} >>> d.popitem() ('age', 18)
还可以通过方法.update(new_dict)
,将new_dict
合并
>>> d = {'name':'九柄'} >>> new = {'age':18, 'gender':'男'} >>> d.update(new) >>> print(d) {'name': '九柄', 'age': 18, 'gender': '男'}
当有重复key的时候会覆盖
>>> d.update({'sex': '女','height': 170}) >>> print(d) {'name': 'xinlan', 'age': 18, 'sex': '女', 'height': 170}
遍历字典使用 for 循环语法,但是要注意要获取字典的 items() 方法, 通过 items() 可以同时得到键值对,element 是一个元组。
new = {'age':18, 'gender':'男'} for element in new.items(): #element是键值对 print(element)
如果一不小心把 items() 落掉了,则只能得到 key:
for element in new: #element只有key print(element)
如果只想获取值,则加上 values(), 快来验证下吧。
for element in new.values(): #element只有value print(element)
Python的 key, value 一般按照先添加,先展示的顺序展示。 如果想对字典排序,就要改变键值对的展示顺序。 下面是一种比较优雅的实现,但用了一些还没讲的内容。
可以为key参数值指定lambda表达式,代码如下:
y1 = {k: v for k, v in sorted(x.items(), key=lambda item: item[1])} print(y1) # 按值降序排列 y2 = {k: v for k, v in sorted(x.items(), key=lambda item: item[1], reverse=True)} print(y2)
这段代码使用了for-in表达式生成了字典,其中x是待排序的字典。items获取了key-value对。而lambda表达式的item就是当前的key-value对。item[0]表示key,item[1]表示value,所以使用item[1],就表示按value排序,而使用item[0],就是按key排序。
字典的操作是非常丰富的,除了上面讲的内容,还有一些进阶操作比如 setdefaultdict 、默认字典,排序字典,都还没涉及到,后面出专门的文章进行说明。