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
keys
和values
方法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}