Python3学习笔记 | 七、Python的类型与运算-字典

一、字典简介

字典在Python里是无序集合对象类型,字典的值都有独立的唯一的键(Key),用相应的键来取值。

Python字典主要特性如下: • 通过键而不是偏移量来读取 • 任意对象的无序组合 • 可变长,异构,任意嵌套 • 属于可映射类型 • 对象引用表

字典用法注意事项: • 序列运算无效 - 串联,分片不能使用 • 对新索引(键)赋值会添加项 • 键不一定是字符串 - 只要是不可变的对象(除了列表和字典)

二、字典的操作

1、基本操作

字典的赋值(格式):

>>> dict = {'D':'Dora','E':'Emon'} #在这里'D'和'E'是键,Dora和Emon是相应的值。

取值:

>>> print("DaXiong's friend is {}{}".format(dict['D'],dict['E']))
DaXiong's friend is DoraEmon

长度:

>>> len(dict)2

判断特定的键是不是存在于字典里:

>>> 'D' in dictTrue

列出所有的键(2.x和3.x有区别):

>>> list(dict.keys())
['D', 'E']

2、原处修改

更改特定键的值:

>>> dict = {'D':'Dora','E':'Emon'}
>>> dict['D'] = 'DaXiong'
>>> dict
{'D': 'DaXiong', 'E': 'Emon'}

增加新的键和相应的值:

>>> dict['J'] = 'Jing'
>>> dict
{'D': 'DaXiong', 'E': 'Emon', 'J': 'Jing'}

删除一个键:

>>> del dict['D']
>>> dict
{'E': 'Emon', 'J': 'Jing'}

三、字典的方法

1、字典的取值

取所有的值:

>>> dict = {'D':'Dora','E':'Emon'}
>>> list(dict.keys())
['D', 'E']
>>> list(dict.values())
['Dora', 'Emon']
>>> list(dict.items())
[('D', 'Dora'), ('E', 'Emon')]

不能确定某个值是不是存在的时候:

>>> dict.get('D','Not Found')  #存在就输出Key对应的Values,不存在就输出自己定义的字符,这里的‘Not Found’就是自己定义的
'Dora'
>>> dict.get('Q','Not Found')
'Not Found'

2、创建字典的方法

最原始的方法:

>>> dict = {'D':'Dora','E':'Emon'}

按键赋值方法:

>>> dict = {}
>>> dict['D'] = 'Dora'
>>> dict['E'] = 'Emon'

变量赋值方法:

c = dict(name='Allen', age=14, gender='male') #此方法没有在我自己的电脑上尝试成功,但语法是没有问题的

元祖列表方法:

e=dict([('name','Allen'),('age',21),('gender','male')]) #此方法没有在我自己的电脑上尝试成功,但语法是没有问题的

参考链接:https://blog.csdn.net/u014291497/article/details/51052139

3、字典的比较

>>> Quentities = {'toast': 45,'muffin': 23,'ham': 78,'spam': 56,'eggs': 89}
>>> max(Quentities)
'toast'
>>> min(Quentities)
'eggs'

我们发现,这里比较的是“键”,而不是相应的“值”,这里使用zip()函数将Quentities字典中的Key与Values顺序进行调换。

zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表),具体可以参考链接:https://blog.csdn.net/eric_sunah/article/details/20551087

>>> max(zip(Quentities.values(),Quentities.keys()))
(89, 'eggs')
>>> min(zip(Quentities.values(),Quentities.keys()))
(23, 'muffin')
>>> sorted(zip(Quentities.values(),Quentities.keys()))
[(23, 'muffin'), (45, 'toast'), (56, 'spam'), (78, 'ham'), (89, 'eggs')]

上面使用sorted进行排序,更改顺序只需要加reverse=True

另外一种字典比较方式:

>>> Quentities = {'toast': 45,'muffin': 23,'ham': 78,'spam': 56,'eggs': 89}
>>> sorted(zip(Quentities.values(),Quentities.keys()))
[(23, 'muffin'), (45, 'toast'), (56, 'spam'), (78, 'ham'), (89, 'eggs')]
>>> max(Quentities,key=lambda k: Quentities[k])
'eggs'
>>> min(Quentities,key=lambda k: Quentities[k])
'muffin'

关于lambda,你可以把这个当成如下函数:

>>> def get_count(k):
... return Quentities[k]
...
>>> min(Quentities,key=get_count)
'muffin'

整体意思就是输出Key最大或最小对应的Values。

4、字典列表的排序

rows = [
... {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
... {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
... {'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
... {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]

需要按fname或者uid排序时需要operator模块里的itemgetter函数:

>>> from operator import itemgetter
>>> rows_by_fname = sorted(rows, key=itemgetter('fname'))
>>> rows_by_uid = sorted(rows, key=itemgetter('uid'))
>>> print(rows_by_fname)
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
>>> print(rows_by_uid)
[{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}, {'fname': 'David', 'lname': 'Beazley', 'uid': 1002}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}, {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]

需要按lname和fname的顺序排列时:

>>> rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
>>> print(rows_by_lfname)
[{'lname': 'Beazley', 'uid': 1002, 'fname': 'David'},
{'lname': 'Cleese', 'uid': 1001, 'fname': 'John'},
{'lname': 'Jones', 'uid': 1004, 'fname': 'Big'},
{'lname': 'Jones', 'uid': 1003, 'fname': 'Brian'}]

5、通过某个字段将记录分组

>>> rows = [
... {'address': '5412 N CLARK', 'date': '07/01/2012'},
... {'address': '5148 N CLARK', 'date': '07/04/2012'},
... {'address': '5800 E 58TH', 'date': '07/02/2012'},
... {'address': '2122 N CLARK', 'date': '07/03/2012'},
... {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
... {'address': '1060 W ADDISON', 'date': '07/02/2012'},
... {'address': '4801 N BROADWAY', 'date': '07/01/2012'},
... {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
... ]
>>> from operator import itemgetter
>>> from itertools import groupby
>>> rows.sort(key=itemgetter('date'))
>>> for date, items in groupby(rows, key=itemgetter('date')):
... print(date)
... for i in items:
... print(' ', i)

07/01/2012
{'date': '07/01/2012', 'address': '5412 N CLARK'}
{'date': '07/01/2012', 'address': '4801 N BROADWAY'}
07/02/2012
{'date': '07/02/2012', 'address': '5800 E 58TH'}
{'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}
{'date': '07/02/2012', 'address': '1060 W ADDISON'}
07/03/2012
{'date': '07/03/2012', 'address': '2122 N CLARK'}
07/04/2012
{'date': '07/04/2012', 'address': '5148 N CLARK'}
{'date': '07/04/2012', 'address': '1039 W GRANVILLE'}

本文分享自微信公众号 - TeamsSix(OldCat0111)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-24

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CV学习史

机器学习中数据清洗&预处理

数据预处理是建立机器学习模型的第一步,对最终结果有决定性的作用:如果你的数据集没有完成数据清洗和预处理,那么你的模型很可能也不会有效

10120
来自专栏授客的专栏

自动化测试 Appium之Python运行环境搭建 Part1

https://pypi.org/project/Appium-Python-Client/#files

9110
来自专栏授客的专栏

Python 使用Python远程连接并操作InfluxDB数据库

https://pan.baidu.com/s/1jAbY4xz5gvzoXxLHesQ-PA

19210
来自专栏授客的专栏

Python 强制停止多线程运行

"""raises the exception, performs cleanup if needed"""

20810
来自专栏授客的专栏

Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控

http://zookeeper.apache.org/releases.html#download

17420
来自专栏keinYe

为 Flask 应用添加用户登录

Flask 是什么?我想打开这篇文章的你应该不陌生,但是我还引用维基百科上的内容做个简短的介绍。

21820
来自专栏授客的专栏

性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程

https://pan.baidu.com/s/1jAbY4xz5gvzoXxLHesQ-PA

12820
来自专栏changxin7

5.Python操作MySQL

Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。

8820
来自专栏授客的专栏

Python 使用python-kafka类库开发kafka生产者&消费者&客户端

http://zookeeper.apache.org/releases.html#download

43630
来自专栏CV学习史

niftynet Demo分析 -- brain_parcellation

论文详细介绍 通过从脑部MR图像中分割155个神经结构来验证该网络学习3D表示的效率 目标:设计一个高分辨率和紧凑的网络架构来分割体积图像中的精细结构 特...

8620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励