您的位置:首页 > 理论基础 > 数据结构算法

python学习笔记2.5-数据结构之字典

2016-11-03 15:12 627 查看
Python中的字典是python的一种数据结构,它的本质是key和value以及其对应关系的一种集合,一个key可以对应一个多个value。合理的使用字典能给我们编程带来很大的方便。

1 字典的创建

price = {'DELL':250,'LENOV0':300,'ACER':280,'ASUS':267}


从例子中可以看到,大括号{}将key和value包围,key和value之间用:表示对应关系。

2 将一个key映射到多个值

有时候根据实际需要会出现一键多值的情况,这种字典叫做一键多值字典(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}})


注意:

列表和集合的操作方法不一样,例如:列表添加用append方法,集合添加用add方法。

列表会保留所有你添加的元素以及添加顺序,不会删除重复元素;而集合会删除重复元素。

关于defaultdict的更多功能有待于继续探索。

3 有序字典

我们有时候需要创建一种字典,对其做迭代或者序列化操作的时候也能控制元素的顺序。对于此类问题,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


4 字典有关计算

Python提供了对字典进行各种运算(最大值,最小值,排序等)的解决方案。

但是很明确,对字典进行操作时候的操作对象是keys,如果被计算的值不是keys而是val
daf2
ues,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')]


5 比较两个字典的相同点

有时候,需要找出两个字典相同的部分(相同的键,相同的值)。由于字典本质上是一个集合,那么对集合进行操作就可以。常用的执行方法有: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 python字典内置函数和方法

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()以列表返回字典中的所有值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息