字典

字典在其他语言中又常被称为关联数组散列表映射,它是一种无序的、可变的数据集合。字典中保存键: 值对(key:value pair)形式的数据。其中必须是唯一的,且必须是可哈希(不可变)类型,通常为字符串或数字;而可以为任意数据类型,且是可以重复的。字典的主要用途是通过键存储、提取值。

从 Python 3.7 开始,字典变为有序的,字典会保留插入时的顺序,对键的更新不会影响顺序,删除并再次添加的键将被插入到末尾。不过为了各个版本的兼容,目前尽量不要依赖字典中元素的排序来实现程序逻辑。

字典支持的常见操作见下页表。

常见的字典操作
运算 结果
list(d) 返回字典 d 中使用的所有键的列表。
len(d) 返回字典 d 中的项数。
d[key] 返回字典 d 中以 key 为键的项,如果不存在此 key 则会引发 KeyError 错误。
d[key] = value d[key] 设为 value,如果存在 key,则修改其对应值,如果不存在,则添加项目。
del d[key] d[key]d 中删除,如果不存在此 key 则会引发 KeyError 错误。
key in d 如果在 d 中存在键 key 则返回 True,否则返回 False
iter(d) 返回以字典的键为元素的迭代器。这是 iter(d.keys()) 的快捷方式。
key not in d 等价于 not key in d
d.clear() 移除字典中的所有元素。
d.copy() 返回原字典的浅拷贝。
dict.fromkeys(iterable[, value]) 使用来自 iterable 的键创建一个新字典,并将各个值设为 value。如果未提供 value,默认值为 None
d.get(key[, default]) 通过键获取值。如果 key 存在则返回对应值,否则返回 default,如果 default 未给出则默认为 None。相对于 d[key],该方法不会引发 KeyError 错误。
d.pop(key[, default]) 通过键删除项。如果 key 存在于字典中则将其移除并返回其值,否则返回 default。 如果 default 未给出且 key 不存在,则会引发 KeyError 错误。
d.items() 返回由字典中的元素(键/值对)组成的一个新视图
d.keys() 返回由字典中的键组成的一个新视图
d.popitem() 从字典中移除并返回一个键/值对。键/值对会按后进先出(LIFO)的顺序被返回。该方法适合对字典进行消耗性迭代。
reversed(d.keys()) 返回一个逆序获取字典键的迭代器。
d.setdefault(key[, default]) 如果字典存在键 key,返回它的值。如果不存在,插入值为 default 的键 key,并返回 defaultdefault 默认为 None。该方法可以安全地向字典中插入值而不会覆盖已有值。
d.update([other]) 使用字典 other 的键/值对更新字典,覆盖原有的键。返回 None
d.values() 返回由字典中的值组成的一个新视图
d | other 合并字典对象 dother 中的键和值来创建一个新的字典。当 dother 有相同键时,other 的值优先。
d |= other other 的键和值更新字典 dother 可以是 mappingiterable 的键/值对。当 dother 有相同键时,other 的值优先。

字典的创建#

可以在花括号内以逗号分隔的键: 值对表示字典:

pet = {'name': '多多', 'species': 'Dog', 'breed': 'Husky',
       'age': 4, 'weight': 14.1}
days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday',
        4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
students = {'20804070201': {'name': '张三', 'gender': '男'},
    '20804070202': {'name': '李四', 'gender': '男'},
    '20804070203': {'name': '王老五', 'gender': '男'},
    '20804070204': {'name': '白冰冰', 'gender': '女'},
    '20804070205': {'name': '赵晓静', 'gender': '女'}}
mixed_dict = {'name': '王老五', 34: 23.3, True: 'Something'}
empty_dict = {}  # 空字典

也可以使用 dict() 函数(这是一个类型构造器)创建字典,该函数有多种形式:

a = {'one': 1, 'two': 2, 'three': 3}  # 直接给出字典字面量
b = dict({'three': 3, 'one': 1, 'two': 2})  # 从字典创建字典
c = dict(one=1, two=2, three=3)  # 通过给定关键字参数来创建字典
# 从包含键/值对元组的列表或元组创建字典
d = dict([('two', 2), ('one', 1), ('three', 3)])
# zip 函数在多个迭代器上并行迭代,从每个迭代器返回一个数据项组成元组。
# 该方法可以将多个列表或元组对应位置的元素组合为元组,进一步创建字典
e = dict(zip(['one', 'two', 'three'], [1, 2, 3]))  # 拉链式键/值对
f = dict({'one': 1, 'three': 3}, two=2)  # 混合使用各种方法
# 以上通过不同形式创建的字典是相等的:
print(a == b == c == d == e == f)  # True
empty_dict = dict()  # 空字典

还可以使用形如 {x: x for x in iterable}字典推导式创建字典:

dict1 = {x: x for x in range(5)}  # {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
dict2 = {x: x ** 2 for x in range(5)}  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
dict3 = {x: x ** 2 for x in range(5) if x % 2 == 0}  # {0: 0, 2: 4, 4: 16}

上例中,dict3 的创建相当于如下代码的简写形式:

dict3 = {}
for x in range(5):
    if x % 2 == 0:
        dict3[x] = x ** 2

访问字典#

不同于列表或元组,访问字典的元素不是通过偏移量,而是通过键来进行。

days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}

print(days)  # {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
print(type(days))  # <class 'dict'>
print(len(days))  # 7
print(list(days))  # [1, 2, 3, 4, 5, 6, 7]
print(days.get(3))  # Wednesday
print(days.get(8))  # None

if 3 in days:
    print(days[3])  # Wednesday

修改字典#

字典对象是可变的,可以随时修改其中的元素,或向其中添加新的键/值对,这些操作都可以通过 d[key] = value 的方式实现。另外,可以通过 del d[key] 删除字典中的某个元素。

days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}

if 7 in days:
    del days[7]  # 删除元素

days[0] = 'Sunday'  # 添加新元素
print(days[0])  # Sunday

print(days[1])  # Monday
days[1] = '星期一'  # 修改元素值
print(days[1])  # 星期一

字典视图对象#

dict.keys(), dict.values()dict.items() 所返回的对象是视图对象。该对象提供字典内项目的一个动态视图,这意味着当字典改变时,视图也会相应改变。字典视图可以被迭代以产生与其对应的数据,并支持使用 in 运算符进行成员检测。

days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}

print(days.keys())  # dict_keys([1, 2, 3, 4, 5, 6, 7])
print(days.values())  # dict_values(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'])
print(days.items())  # dict_items([(1, 'Monday'), (2, 'Tuesday'), (3, 'Wednesday'), (4, 'Thursday'), (5, 'Friday'), (6, 'Saturday'), (7, 'Sunday')])

# 可以通过 list(), tuple() 或 set() 函数将这些视图对象转换为列表、元组或集合
print(list(days.keys()))  # [1, 2, 3, 4, 5, 6, 7]

print('Wednesday' in days.values())  # True

遍历字典#

一般通过遍历某个字典视图对象来遍历字典。如下所示:

days = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}

for key, value in days.items():
    print(key, value)

# 1 Monday
# 2 Tuesday
# 3 Wednesday
# 4 Thursday
# 5 Friday
# 6 Saturday
# 7 Sunday
集合课后作业