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 条评论
登录 后参与评论

相关文章

来自专栏lulianqi

支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)

csv(Comma Separated Values)逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本...

632
来自专栏Vamei实验室

Python基础09 面向对象的进一步拓展

我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数。这个参数表示某个...

1816
来自专栏程序员与猫

常见的正则表达式解读释义

又名:写给正在学习前端的女友看的常见正则表达式解读。原文发布于 https://www.zybuluo.com/wddpct/note/728081 。 ...

1749
来自专栏灯塔大数据

塔秘 | 从Zero到Hero,一文掌握Python关键代码

前 言 本文整体梳理了 Python 的基本语法与使用方法,并重点介绍了对机器学习十分重要且常见的语法,如基本的条件、循环语句,基本的列表和字典等数据结构,此...

3358
来自专栏进击的君君的前端之路

this_原型链_继承

962
来自专栏安恒信息

利用WPAD/PAC与JScript实现Windows 10远程代码执行

简介 Project Zero团队在google发表了一篇关于利用WPAD/PAC和JScript在本地网络中实现Windows10远程代码执行的博客,笔者根据...

2025
来自专栏Vamei实验室

Python基础09 面向对象的进一步拓展

我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数。这个参数表示某个...

1867
来自专栏绿巨人专栏

不变(Invariant), 协变(Covarinat), 逆变(Contravariant) : 一个程序猿进化的故事

3605
来自专栏北京马哥教育

从Zero到Hero,一文掌握Python关键代码

本文整体梳理了 Python 的基本语法与使用方法,并重点介绍了对机器学习十分重要且常见的语法,如基本的条件、循环语句,基本的列表和字典等数据结构,此外还介绍...

2827
来自专栏noteless

[三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。

682

扫码关注云+社区