blog:https://www.cnblogs.com/Rohn
Tips:本文中代码均使用
3.8.x
版本的Python。部分文字来自网络,侵删。
字典
像列表一样,字典是许多值的集合。但不像列表的下标,字典的索引可以使用许多不同数据类型,不只是整数。字典的索引被称为“键”,键及其关联的值称为键-值对。
语法格式
dictname = {'key':'value1', 'key2':'value2', ..., 'keyn':valuen}
例如
myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
将一个字典赋给myCat
变量。这个字典的键是'size'
、'color'
和'disposition'
。这些键相应的值是'fat'
、'gray'
和'loud'
。可以通过它们的键访问这些值:
>>> myCat['size']
'fat'
字典仍然可以用整数值作为键, 就像列表使用整数值作为下标一样, 但它们不必从0
开始,可以是任何数字。
a = {12: 'fish', 523: 'lion'}
字典与列表的区别
不像列表,字典中的表项是不排序的。但字典中没有“第一个”表项。虽然确定两个列表是否相同时,表项的顺序很重要,但在字典中,键-值对输入的顺序并不重要。
>>> a = ['dog','fish','cat']
>>> b = ['fish','dog','cat']
>>> a == b
False
>>> a={3:'dog',23:'cat',53:'fish'}
>>> b={23:'cat',3:'dog',53:'fish'}
>>> a == b
True
因为字典是不排序的,所以不能像列表那样切片。尝试访问字典中不存在的键,将导致KeyError
出错信息。这很像列表的“越界”IndexError
出错信息。
>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
>>> myCat['age']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'age'
字典的方法
字典的键、值和键-值对
字典的键、值和键-值对:keys()
、values()
和items()
。
利用keys()
、values()
和items()
方法,循环分别可以迭代键、值或键-值对。请注意,items()
方法返回的dict_items
值中,包含的是键和值的元组。
>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
>>> for i in myCat.values():
... print(i)
...
fat
gray
loud
>>> for i in myCat.keys():
... print(i)
...
size
color
disposition
>>> for i in myCat.items():
... print(i)
...
('size', 'fat')
('color', 'gray')
('disposition', 'loud')
通过in
和not in
检查某个键或值是否存在于字典中。
>>> 'name' in myCat.keys()
False
>>> 'size' in myCat.keys()
True
>>> 'gray' in myCat.values()
True
>>> 'gray' not in myCat.values()
False
get()方法
字典有一个get()
方法,它有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值。
a = {'cat': 2,'dog': 5,'fish': 10}
>>> 'I have ' + str(a.get('fish', 0)) + ' fish.'
'I have 10 fish.'
>>> 'I have ' + str(a.get('bird', 0)) + ' birds.'
'I have 0 birds.'
setdefault()方法
setdefault()
方法提供了一种方式,在一行中完成这件事。传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。
a = {'cat': 2,'dog': 5,'fish': 10}
>>> a.setdefault('bird',3)
3
>>> a
{'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}
>>> a.setdefault('bird',6)
3
>>> a
{'cat': 2, 'dog': 5, 'fish': 10, 'bird': 3}
常见问题解决方案
字典中的键映射多个值
问题
怎样实现一个键对应多个值的字典?
解决方案
如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面。例如:
d = {
'a' : [1, 2, 3],
'b' : [4, 5]
}
e = {
'a' : {1, 2, 3},
'b' : {4, 5}
}
选择使用列表还是集合取决于你的实际需求。如果你想保持元素的插入顺序就应该使用列表, 如果想去掉重复元素就使用集合(并且不关心元素的顺序问题)。
字典的运算
问题
怎样在数据字典中执行一些计算操作,比如求最小值、最大值?
以下是蔬菜价格的数据字典:
vegetables = {
'tomato': 3.50,
'potato': 2.32,
'cucumber': 1.75,
'eggplant': 5.15,
'pepper': 8.99
}
找出价格最便宜的蔬菜和最贵的蔬菜。
解决方案
如果你在一个字典上执行普通的数学运算,你会发现它们仅仅作用于键,而不是值。比如:
print(min(vegetables)) # Returns 'cucumber'
print(max(vegetables)) # Returns 'tomato'
使用字典的 values()
方法来解决这个问题:
a = min(vegetables.values())
b = max(vegetables.values())
print(f'The lowest price for vegetables is {a}.')
print(f'The highest price for vegetables is {b}.')
输出结果为:
The lowest price for vegetables is 1.75.
The highest price for vegetables is 8.99.
但不是最终需要得到的结果,最终需要知道最低和最高价格的蔬菜。
zip()
函数方案通过将字典”反转”为 (值,键) 元组序列来解决了上述问题。
a = min(zip(vegetables.values(),vegetables.keys()))
b = max(zip(vegetables.values(),vegetables.keys()))
print(f'The lowest price for vegetables is {a}')
print(f'The highest price for vegetables is {b}')
输出结果为:
The lowest price for vegetables is (1.75, 'cucumber')
The highest price for vegetables is (8.99, 'pepper')