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

原创 2016年11月03日 15:12:38

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而是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')]

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() 以列表返回字典中的所有值
版权声明:本文为博主原创文章,未经博主允许不得转载。本博客所用Python软件环境:win10+anaconda3+pycharm,Python版本:3.6

python学习笔记1-理解Python语言

本章主要介绍一下python语言的相关知识,包括其语言类型、作为面向对象的3大特性以及5大原则,在末尾介绍了其优缺点。python是解释型的脚本语言解释型语言与C/C++等编译型语言相比,python...

python学习笔记2.1-运行环境、编辑器、库的安装

本章主要结合实例介绍python的编程环境以及库的安装,属于准备工作。一. python环境以及库的安装python的环境比较小,百度一下就能出来,但是并不包含其他的库。python的好处就是丰富的库...

python学习笔记(十六)——字典+collections模块的其他数据结构

#1、字典 #1、1字典(dict或映射)是一组键/值对的数据结构,根据键可以查询到值 #字典的键必须是可hash的对象,而值都可 print(hash(100)) print(hash(1.23))...

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!...

python学习笔记2.4-数据结构之列表和元组

python语言中包含的数据结构比较简单,除了简单的变量以外,还有列表(元组)、字典、集合。对于数据结构的操作一般包含四种:增、删、查、改。本文主要介绍列表(list)(包括元组tuple)的操作。 ...

python数据结构学习笔记-2016-10-15-02-生命游戏

2.5 生命游戏         生命游戏由英国数学及John H.Conway设计,是一个零人游戏。         2.5.1 游戏规则         这个游戏使用一张无限大的直角坐标网格,每一...

python数据结构学习笔记-4-堆栈 队列

堆栈、队列
  • hjh00
  • hjh00
  • 2015年11月02日 17:19
  • 1050

python数据结构学习笔记-2016-11-05-01-队列ADT及其实现

8.1 队列ADT        队列(queue):只能在一端插入元素,在另一端删除元素的容器。其特点是先进先出(first-in first-out, FIFO)。        插入元素的一端称...

Python学习笔记(1)--数据结构

1。判断脚本是自己的主块还是在其他脚本中import以模块运行。 通过__name__的值去判断,如果为__main__就是运行脚本的主块, 例如: if __name__ == '__mai...
  • ljsbuct
  • ljsbuct
  • 2012年01月10日 16:46
  • 508

python数据结构学习笔记-2016-11-02-01-栈的应用

7.3 应用         7.3.1 括号匹配         无论是在计算表达式还是在C++代码中,都会碰到括号匹配问题。如以下的C++代码: int sumList(int theList[]...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python学习笔记2.5-数据结构之字典
举报原因:
原因补充:

(最多只允许输入30个字)