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

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()

以列表返回字典中的所有值

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

第七节 Go语言运算符

干货来了!!!为了让更多的小伙伴喜欢Golang、加入Golang之中来,Golang语言社区发起人彬哥联合业界大牛共同推出了Go语言基础、进阶、提高课程,目前...

993
来自专栏王磊的博客

《JavaScript权威指南》——JavaScript核心

前言 这本由David Flanagan著作,并由淘宝前端团队译的《JavaScript权威指南》,也就是我们俗称的“犀牛书”,算是JS界公认的“圣经”了。本书...

3479
来自专栏章鱼的慢慢技术路

用Go语言实现一个简单的聊天机器人

Go语言基本构成要素:标识符、关键字、字面量、分隔符、操作符。它们可以组成各种表达式和语句,而后者都无需以分号结尾。

912
来自专栏技术之路

c++ 指针(二)

函数指针 可以使用算法的地址传递给方法,传递之前要先完成以下工作 1.获取函数的地址 2.声明一个函数指针 3.使用函数指针来调用函数 1.获取函数的地址,只要...

1707
来自专栏软件开发

JavaSE学习总结(四)——Java面向对象十分钟入门

面向对象编程(Object Oriented Programming,OOP)是一种计算机模拟人类的自然思维方式的编程架构技术,解决了传统结构化开发方法中客观...

2437
来自专栏小樱的经验随笔

彻底搞定C语言指针(精华版)

1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: ...

3163
来自专栏Golang语言社区

基础篇--Go 语言运算符

运算符用于在程序运行时执行数学或逻辑运算。 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 接下来让我们来详细...

2945
来自专栏互联网开发者交流社区

Java逻辑

1244
来自专栏专注 Java 基础分享

Java 内部类的意义及应用

众所周知,我们的 C++ 程序语言是多继承制的,而多继承明显的好处就是,相对而言只需要写较少的代码即可完成一个类的定义,因为我们可以通过继承其它类来获取别人的实...

3074
来自专栏王磊的博客

《JavaScript权威指南》——JavaScript核心

883

扫码关注云+社区