跳转至

2.8.Dict

Windows 10
Python 3.7.3 @ MSC v.1915 64 bit (AMD64)
Latest build date 2020.06.21

映射(mapping)是通过名称来访问其各个值的数据结构。字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。

创建dict

字典以类似于下面的方式表示:

phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

字典由键及其相应的值组成,这种键--值对称为项(item)。每个键与其值之间都用冒号:分隔,item之间用逗号分隔,而整个字典放在花括号内。空字典(没有任何项)用两个花括号{}表示。

注意

在字典(以及其他映射类型)中,键必须是独一无二的,而字典中的值无需如此。

可使用dict类从其他映射(如其他字典)或键–值对序列创建字典。

items = [('name', 'Gumby'), ('age', 42)] 
dict(items)
{'name': 'Gumby', 'age': 42}

还可使用关键参数,如下所示:

dict(name='Gumby', age=42)
{'name': 'Gumby', 'age': 42}

Dict的方法

字典的基本行为在很多方面都类似于序列。

  • len(d)返回字典d包含的项(键--值对)数。
  • d[k]返回与键k相关联的值。
  • d[k] = v将值v关联到键k。
  • del d[k]删除键为k的项。
  • k in d检查字典d是否包含键为k的项。

虽然字典和列表有多个相同之处,但也有一些重要的不同之处。

  • 自动添加。dict可以给不存在的项赋值,即是字典中原本没有的键,也可以给它赋值。而如果不使用append或其他类似的方法,就不能给列表中没有的元素赋值。

  • 成员资格。表达式k in d (其中d是一个字典)査找的是键而不是值;而表达式v in 1 (其中1是一个列表)查找的是值而不是索引。这看似不太一致,但你习惯后就会觉得相当自然。毕竟如果字典包含指定的键,检查相应的值就很容易。

clear删除所有的字典项

要注意的是,clear是清除了一个字典对象,而不是解除了名称与字典对象的绑定。

a = {"a":1,"b": 2,"c":3}
b = a
a.clear()
# 可以看到,a、b都变成了字典
print("a的值:",a)
print("b的值:",a)
a的值: {}
b的值: {}

copy浅拷贝

a = {"a":1,"b": 2,"c":[1,2]}
b = a.copy()
b["c"][0] = 10
print("a的值:",a)
print("b的值:",a)
a的值: {'a': 1, 'b': 2, 'c': [10, 2]}
b的值: {'a': 1, 'b': 2, 'c': [10, 2]}

fromkeys

dict.fromkeys(key, value)

方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None,也可以指定值,

dict.fromkeys(["a","b"])
{'a': None, 'b': None}
dict.fromkeys(["a","b"],10)
{'a': 10, 'b': 10}

get

方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误。

a = {"a":1,"b": 2,"c":3}

try:
    a["d"]
except KeyError as e:
    print("KeyError: ", e)
KeyError:  'd'

而使用get不会这样

a = {"a":1,"b": 2,"c":3}
a.get("d")
# 默认返回None,也可以指定返回值
a.get("d","N/A")
'N/A'

items

方法items返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式。字典项在列表中的排列顺序不确定。返回值属于一种名为字典视图的特殊类型。字典视图可用于迭代。另外,你还可确定其长度以及对其执行成员资格检查。

a = {"a":1,"b": 2,"c":3}
a.items()
dict_items([('a', 1), ('b', 2), ('c', 3)])
# dict_items类型
type(a.items())
dict_items
# 迭代
for i in a.items():
    print(i)
('a', 1)
('b', 2)
('c', 3)
# 迭代
for key, value in a.items():
    print(key, end=" ")
    print(value)
a 1
b 2
c 3
# 检查成员资格
("a",1) in a.items()
True

keysvalues

方法keys返回一个字典视图,其中包含字典中的键。

a = {"a":1,"b": 2,"c":3}
a.keys()
dict_keys(['a', 'b', 'c'])

方法values返回一个字典视图,其中包含字典中的键。

a.values()
dict_values([1, 2, 3])

pop

方法pop可用于获取与指定键相关联的值,并将该键-值对从字典中删除。

a = {"a":1,"b": 2,"c":3}
b = a.pop("a")
print("b的值",b)
print("a的值",a)
b的值 1
a的值 {'b': 2, 'c': 3}

popitem

方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念。如果你要以高效地方式逐个删除并处理所有字典项,这可能很有用,因为这样无需先获取键列表。

a = {"a":1,"b": 2,"c":3}
a.popitem()
('c', 3)
a
{'a': 1, 'b': 2}

setdefault

方法setdefault有点像get,因为它也获取与指定键相关联的值,但除此之外,setdefault还在字典不包含指定的键时,在字典中添加指定的键-值对。

a = {"a":1,"b": 2,"c":3}
a.setdefault("a")
a

a.setdefault("d")
a
{'a': 1, 'b': 2, 'c': 3, 'd': None}

如你所见,指定的键不存在时,setdefault返回指定的值并相应地更新字典。如果指定的键存在,就返回其值,并保持字典不变。与get一样,值是可选的,如果没有指定,默认为None。

update

方法update使用一个字典中的项来更新另一个字典。对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就替换它。

a = {"a":1,"b": 2,"c":3}
a.update({"d":4})
a
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

可像调用本章前面讨论的函数dict(类型构造函数)那样调用方法update。这意味着调用update时,可向它提供一个映射、一个由键-值对组成的序列(或其他可迭代对象)或关键字参数。

a.update(zip(["e","f"],[5,6]))
a
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}