Python dict字典方法完全攻略(全)

我们知道,字典的数据类型为 dict,我们可使用 dir(dict) 来查看该类包含哪些方法。在交互式解释器中输入 dir(dict) 命令,将看到如下输出结果:

>>> dir(dict)
['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

这些方法中,clear()、fromkeys()、get() 方法的功能和用法已经在前面章节中讲过,这里不再重复介绍。下面给大家一一介绍另外的这些方法。

Python keys()、values() 和 items()方法

这 3 个方法之所以放在一起介绍,是因为它们都用来获取字典中的特定数据。keys() 方法用于返回字典中的所有键;values() 方法用于返回字典中所有键对应的值;items() 用于返回字典中所有的键值对。

例如:
a = {'数学': 95, '语文': 89, '英语': 90}
print(a.keys())
print(a.values())
print(a.items())
运行结果为:

dict_keys(['数学', '语文', '英语'])
dict_values([95, 89, 90])
dict_items([('数学', 95), ('语文', 89), ('英语', 90)])


注意,在 Python 2.x 中,这三个方法的返回值是列表类型。但在 Python 3 中,并不是我们常见的列表和元组类型,因为 Python 3不希望用户直接操作这几个方法的返回值。如果想使用返回的数据,有以下 2 种方法:
  1. 使用 list() 函数,将它们返回的数据转换成列表,例如:
    a = {'数学': 95, '语文': 89, '英语': 90}
    b = list(a.keys())
    print(b)
    运行结果为:

    ['数学', '语文', '英语']

  2. 也可以利用多重赋值的技巧,利用循环结构将键或值分别赋给不同的变量,比如说:
    a = {'数学': 95, '语文': 89, '英语': 90}
    for k in a.keys():
        print(k,end=' ')
    print("\n---------------")
    for v in a.values():
        print(v,end=' ')
    print("\n---------------")
    for k,v in a.items():
        print("key:",k," value:",v)
    运行结果为:

    数学 语文 英语
    ---------------
    95 89 90
    ---------------
    key: 数学  value: 95
    key: 语文  value: 89
    key: 英语  value: 90

    由于目前尚未学习 for 循环,初学者可先跳过此种方法,等学会 for 循环后再回过头来学习。

Python copy()方法

copy() 方法用于返回一个具有相同键值对的新字典,例如:
a = {'one': 1, 'two': 2, 'three': [1,2,3]}
b = a.copy()
print(b)
运行结果为:

{'one': 1, 'two': 2, 'three': [1, 2, 3]}

可以看到,通过 copy() 方法,就可以将字典 a 的数据拷贝给字典 b。

注意,copy() 方法所遵循的拷贝原理,既有深拷贝,也有浅拷贝。拿拷贝字典 a 为例,copy() 方法只会对最表层的键值对进行深拷贝,也就是说,它会再申请一块内存用来存放 {'one': 1, 'two': 2, 'three': []};而对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,b 中的 [1,2,3] 的值不是自己独有,而是和 a 共有。

例如:
a = {'one': 1, 'two': 2, 'three': [1,2,3]}
b = a.copy()
#向 a 中添加新键值对,由于b已经提前将 a 所有键值对都深拷贝过来,因此 a 添加新键值对,不会影响 b。
a['four']=100
print(a)
print(b)
#由于 b 和 a 共享[1,2,3](浅拷贝),因此移除 a 中列表中的元素,也会影响 b。
a['three'].remove(1)
print(a)
print(b)
运行结果为:

{'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [1, 2, 3]}
{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [2, 3]}

从运行结果不难看出,对 a 增加新键值对,b 不变;而修改 a 某键值对中列表内的元素,b也会相应改变。

Python update()方法

update() 方法可使用一个字典所包含的键值对来更新己有的字典。

在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。

例如:
a = {'one': 1, 'two': 2, 'three': 3}
a.update({'one':4.5, 'four': 9.3})
print(a)
运行结果为:

{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}

从上面的执行过程可以看出,由于被更新的 dict 中已包含 key 为“one”的键值对,因此更新时该键值对的 value 将被改写;但如果被更新的 dict 中不包含 key 为“four”的键值对,那么更新时就会为原字典增加一个键值对。

Python pop方法

pop() 方法用于获取指定 key 对应的 value,并删除这个键值对。

如下方法示范了 pop() 方法的用法:
a = {'one': 1, 'two': 2, 'three': 3}
print(a.pop('one'))
print(a)
运行结果为:

1
{'two': 2, 'three': 3}

此程序中,第 2 行代码将会获取“one”对应的值 1,并删除该键值对。

Python popitem()方法

popitem() 方法用于随机弹出字典中的一个键值对。

注意,此处的随机其实是假的,它和 list.pop() 方法一样,也是弹出字典中最后一个键值对。但由于字典存储键值对的顺序是不可知的,因此 popitem() 方法总是弹出底层存储的最后一个键值对。

如下代码示范了 popitem() 方法的用法:
a = {'one': 1, 'two': 2, 'three': 3}
print(a)
# 弹出字典底层存储的最后一个键值对
print(a.popitem())
print(a)
运行结果为:

{'one': 1, 'two': 2, 'three': 3}
('three', 3)
{'one': 1, 'two': 2}

实际上,由于 popitem 弹出的是一个元组,因此我们也可以通过序列解包的方式,用两个变量分别接收 key 和 value。

例如如下代码:
a = {'one': 1, 'two': 2, 'three': 3}
# 将弹出项的key赋值给k、value赋值给v
k, v = a.popitem()
print(k, v)
运行结果为:

three 3

Python setdefault()方法

setdefault() 方法也用于根据 key 来获取对应 value 的值。但该方法有一个额外的功能,即当程序要获取的 key 在字典中不存在时,该方法会先为这个不存在的 key 设置一个默认的 value,然后再返回该 key 对应的 value。

也就是说,setdefault() 方法总能返回指定 key 对应的 value;如果该键值对存在,则直接返回该 key 对应的 value;如果该键值对不存在,则先为该 key 设置默认的 value,然后再返回该 key 对应的 value。

如下代码示范了 setdefault() 方法的用法:
a = {'one': 1, 'two': 2, 'three': 3}
# 设置默认值,该key在dict中不存在,新增键值对
print(a.setdefault('four', 9.2))
print(a)
# 设置默认值,该key在dict中存在,不会修改dict内容
print(a.setdefault('one', 3.4))
print(a)
运行结果为:

9.2
{'one': 1, 'two': 2, 'three': 3, 'four': 9.2}
1
{'one': 1, 'two': 2, 'three': 3, 'four': 9.2}