Python中的字典是python的一种数据结构,它的本质是key和value以及其对应关系的一种集合,一个key可以对应一个多个value。合理的使用字典能给我们编程带来很大的方便。
price = {'DELL':250,'LENOV0':300,'ACER':280,'ASUS':267}
从例子中可以看到,大括号{}将key和value包围,key和value之间用:表示对应关系。
有时候根据实际需要会出现一键多值的情况,这种字典叫做一键多值字典(multidict),我们知道字典本身就是一种容器,每一个键值都映射到单独的值上,如果这个值也是一个容器(list列表或者集合set),容器中有很多元素,那么就能解决一键多值的问题。Python在实际编程中有两种解决方案。
2.1 用列表(list)来包含多值
price1 ={'HUAWEI':[130,450,786],'OPPO':[320,450],'VIVO':[450,233,999,565]}
print(price1)
print(price1['VIVO'])
print(price1['HUAWEI'][1])
控制台输出:
{'HUAWEI': [130, 450, 786], 'VIVO': [450, 233, 999, 565], 'OPPO': [320, 450]}
[450, 233, 999, 565]
130
2.2 用集合来包含多值
price1 = {'HUAWEI':{130,450,786},'OPPO':{320,450},'VIVO':{450,233,999,565}}
print(price1)
print(price1['VIVO'])
print(price1['HUAWEI'])
控制台输出:
{'OPPO': {320, 450}, 'VIVO': {233, 450, 565, 999}, 'HUAWEI': {450, 786, 130}}
{233, 450, 565, 999}
{450, 786, 130}
要使用列表还是集合完全取决于应用的意图,如果希望保留元素插入的顺序,如果希望消除重复的元素就用集合。
2.3 创建带默认值得字典
2.1和2.2 解决一键多值字典的方法很常用,我们可以利用python环境中的collections模块中的defaultdict类来创建一键多值字典。Defauldict类的特点就是它会自动初始化第一个值,这样只需要关注添加元素即可,非常的方便。
from collections import defaultdict as ddict
d1 = ddict(list)
d1['HUAWEI'].append(340)
d1['HUAWEI'].append(250)
d1['VIVO'].append(666)
d1['VIVO'].append(222)
print(d1)
控制台输出:
defaultdict(<class 'list'>, {'HUAWEI': [340, 250], 'VIVO': [666, 222]})
from collections import defaultdict as ddict
d1 = ddict(set)
d1['HUAWEI'].add(340)
d1['HUAWEI'].add(340)
d1['HUAWEI'].add(250)
d1['VIVO'].add(666)
d1['VIVO'].add(222)
d1['HUAWEI'].add(250)
print(d1)
控制台输出:
defaultdict(<class 'set'>, {'HUAWEI': {250, 340}, 'VIVO': {666, 222}})
注意:
我们有时候需要创建一种字典,对其做迭代或者序列化操作的时候也能控制元素的顺序。对于此类问题,python库中的collections模块中的ordereddict提供了很好的解决方案。
Ordereddict的内部维护了一个双向链表,它会根据元素加入的顺序来排列键的位置。第一个新加入的元素放置在链表的末尾,接下来对已存在的键做重新复制不会改变键的顺序。但也很容易发现,这种类型的字典需要额外的链表来储存,会增大内存,不适合大规模数据的处理。
from collections import OrderedDict as odict
d2 = odict()
d2['4'] = 77
d2['5'] = 44
d2['2'] = 73
d2['3'] = 71
print(d2)
for i in d2:
print(i,d2[i])
控制台输出:
OrderedDict([('4', 77), ('5', 44), ('2', 73), ('3', 71)])
4 77
5 44
2 73
3 71
Python提供了对字典进行各种运算(最大值,最小值,排序等)的解决方案。 但是很明确,对字典进行操作时候的操作对象是keys,如果被计算的值不是keys而是values,zip()提供了很好的解决办法,中心思想就是是利用zip()将key和value反过来再进行计算。 如果不用zip():
price = {'DELL':250,'LENOV0':300,'ACER':280,'ASUS':267}
min_price = min(price)
print(min_price)
得到的结果是:
ACER
很显然不是我们想要的结果。利用zip():
price = {'DELL':250,'LENOV0':300,'ACER':280,'ASUS':267}
min_price = min(zip(price.values(),price.keys()))
print(min_price)
得到的结果:
(250, 'DELL') 很显然就是正确的结果。
如果当两个values相同的时候,这时候的排序依据就是keys了:
price = {'DELL':250,'LENOV0':250,'ACER':280,'ASUS':250}
min_price = min(zip(price.values(),price.keys()))
sort_price = sorted(zip(price.values(),price.keys()))
print(sort_price)
控制台输出:
[(250, 'ASUS'), (250, 'DELL'), (250, 'LENOV0'), (280, 'ACER')]
有时候,需要找出两个字典相同的部分(相同的键,相同的值)。由于字典本质上是一个集合,那么对集合进行操作就可以。常用的执行方法有:keys()和items()
a = {'DELL':250,'LENOV0':250,'ACER':280,'ASUS':250}
b = {'DELL':233,'SHENZHOU':250,'ACER':280,'ZH':267}
c = a.keys() & b.keys()
d = a.items() & b.items()
print(c)
print(d)
控制台打印:
{'ACER', 'DELL'}
{('ACER', 280)}
这种方法有时候可以用来修改或者过滤字典中的内容。
a = {'DELL':250,'LENOV0':250,'ACER':280,'ASUS':250}
b = {'DELL':233,'SHENZHOU':250,'ACER':280,'ZH':267}
c = {key:a[key] for key in a.keys() - b.keys() }
print(c)
控制台输出:
{'ASUS': 250, 'LENOV0': 250}
6.1 Python字典包含的内置函数:
函数 | 功能 |
---|---|
cmp(dict1, dict2) | 比较两个字典元素。 |
len(dict) | 计算字典元素个数,即键的总数。 |
str(dict) | 输出字典可打印的字符串表示。 |
type(variable) | 返回输入的变量类型,如果变量是字典就返回字典类型。 |
6.2 Python字典包含了以下内置方法:
函数 | 功能 |
---|---|
radiansdict.clear() | 删除字典内所有元素 radiansdict.copy():返回一个字典的浅复制 |
radiansdict.fromkeys() | 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
radiansdict.get(key, default=None) | 返回指定键的值,如果值不在字典中返回default值 |
radiansdict.has_key(key) | 如果键在字典dict里返回true,否则返回false |
radiansdict.items() | 以列表返回可遍历的(键, 值) 元组数组 |
radiansdict.keys() | 以列表返回一个字典所有的键 |
radiansdict.setdefault(key, default=None) | 和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default |
radiansdict.update(dict2) | 把字典dict2的键/值对更新到dict里 |
radiansdict.values() | 以列表返回字典中的所有值 |