一、 collections 中 defaultdict 的使用

1.1 字典的键映射多个值

将下面的列表转成字典

l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]

一个字典就是一个键对应一个单值的映射,而上面的列表中有相同键。如果你想要一个键映射多个值,那么就需要将这多个值放到另外的序列中,比如 list 或者 set 里面,像下面这样:

d = {

'a': [1, 2, 3],

'b': [4, 5]

}

e = {

'a': {1, 2, 3},

'b': {4, 5}

}

你可以很方便的使用 collections 模块中的 defaultdict 来构造这样的字典。 defaultdict 的一个特征是它会自动初始化每个 key 刚开始对应的值。

In [1]: l = [('a',2),('b',3),('a',1),('b',4),('a',3),('a',1),('b',3)]

In [2]: from collections import defaultdict

In [3]: d = defaultdict(list)

In [4]: for key, value in l:

...: d[key].append(value)

...:

In [5]: d

Out[5]: defaultdict(list, {'a': [2, 1, 3, 1], 'b': [3, 4, 3]})

当然这个默认的容器不一定是 list, 也可以是集合 set。根据自己的需求选择用 list 还是 set 。如果你想保持元素的插入顺序就应该使用列表,如果想去掉重复元素就使用集合!

1.2 统计字典中某个值出现的次数

来源于微信交流群里一个朋友工作中的问题,列表中有很多字典,需要统计字典中相同的键对应的值的和

利用 defaultdict 设置默认值的方法 defaultdict(int),代码如下:

In [6]: d = defaultdict(int)

In [7]: objs = [{'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}, {'F29958SVDK6': 12}]

In [8]: for obj in objs:

...: for key,value in obj.items():

...: d[key] += value

...:

In [9]: d

Out[9]: defaultdict(int, {'F29958SVDK6': 60})

二、collections 创建有序字典

字典dict是无序的,如果我们想要有序的dict,可以使用OrdereDict 。示例如下:

In [11]: from collections import OrderedDict

In [12]: d = OrderedDict()

In [13]: d['bar'] = 2

In [14]: d['non'] = 8

In [15]: d['sek'] = 5

In [16]: d

Out[17]: OrderedDict([('bar', 2), ('non', 8), ('sek', 5)])

OrderedDict 内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元 素插入进来的时候,它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会 改变键的顺序。

需要注意的是,一个 OrderedDict 的大小是一个普通字典的两倍,因为它内部维 护着另外一个链表。所以如果你要构建一个需要大量 OrderedDict 实例的数据结构的 时候 (比如读取 100,000 行 CSV 数据到一个 OrderedDict 列表中去),那么你就得仔细权衡一下是否使用 OrderedDict 带来的好处要大过额外内存消耗的影响。

2.1 改变 key-value 的顺序

OrderedDict 是有序的字典,同时也能改变其顺序。比如我们想要改变有序的 OrderedDict 对象的 key-value 顺序,可以使用 move_to_end(key)。还是以上面创建的有序字典为例子

In [18]: d.move_to_end("bar")

In [20]: d

Out[20]: OrderedDict([('non', 8), ('sek', 5), ('bar', 2)])

可以看到之前排在第一位的 bar被移到最后一位了。move_to_end 还接收一个关键字参数 last。last 默认为 True,当 last = False 的时候,表示将该键移动到最前面!

2.2 删除 key_value

如果我们要删除有序字典中的 key-value, 可以使用 popitem 方法, popitem(last=True) 按照先进后出的顺序删除 dict中 的 key-value,popitem(last=False) 按照先进先出的规则删除 dict 中的 key-value。

In [42]: d

Out[42]: OrderedDict([('bar', 2), ('non', 8), ('sek', 5)])

In [43]: d.popitem(last=False)

Out[43]: ('bar', 2)

In [44]: d

Out[44]: OrderedDict([('non', 8), ('sek', 5)])

三、字典排序

利用Python 内置函数 sorted 对字典的键或者值进行排序,首先来了解下 sorted 函数

sorted(iterable, key=None, reverse=False)

参数说明:

iterable -- 可迭代对象

key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

3.1 按照 key 进行排序

理解了 sorted 函数就好办了,代码如下:

In [55]: d = {'b':3,'a':4,'c':2,'d':1}

In [57]: d.items()

Out[57]: dict_items([('b', 3), ('a', 4), ('c', 2), ('d', 1)])

In [58]: sorted(d.items(), key=lambda i:i[0])

Out[58]: [('a', 4), ('b', 3), ('c', 2), ('d', 1)]

3.2 按照 value 进行排序

代码如下:

In [59]: sorted(d.items(), key=lambda i:i[1])

Out[59]: [('d', 1), ('c', 2), ('b', 3), ('a', 4)]

注意排序后的返回值是一个list,而原字典中的名值对被转换为了list中的元组。

四、通过某个关键字排序一个字典列表

假设你有一个字典列表, 如下:

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} ]

你想根据某个或某几个字典字段来排序这个列表。

通过使用 operator 模块的 itemgetter 函数,可以非常容易的排序这样的数据结构,代码如下:

In [46]: from operator import itemgetter

In [47]: rows_by_fname = sorted(rows, key=itemgetter('fname'))

In [48]: rows_by_fname

Out[48]:

[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},

{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},

{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},

{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]

In [49]: rows_by_uid = sorted(rows, key=itemgetter('uid'))

In [50]: rows_by_uid

Out[50]:

[{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},

{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},

{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},

{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]

itemgetter() 函数也支持多个 keys,比如下面的代码:

In [52]: rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))

In [53]: rows_by_fname

Out[53]:

[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},

{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},

{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},

{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]

python字典高级用法_Python 进阶编程之字典的高级用法相关推荐

  1. python flag用法_Python 进阶之路 (四) 先立Flag, 社区最全的Set用法集锦

    Set是什么 大家好,恰逢初五迎财神,先预祝大家新年财源滚滚!! 在上一期详解tuple元组的用法后,今天我们来看Python里面最后一种常见的数据类型:集合(Set) 与dict类似,set也是一组 ...

  2. python定义字典对象时_Python对象类型之字典

    intumu.com:机器学习(ML).人工智能(AI)和土木工程的(TM)关系?​zhuanlan.zhihu.com 前言 着手开始写的时候就一直有一个画面在脑子中出现:小猪佩奇第N级,猪爸爸拿出 ...

  3. python与建筑行业_Python+AI+CC,这些建模“高级功能”,90%的人不知道

    1. Python编写脚本,实现CC自动化建模 Python脚本实现CC自动化建模 MasterKernel是一个以编程方式访问ContextCapture Master所有功能的Python模块,此 ...

  4. python读取字典元素笔记_Python中列表、字典、元组数据结构的简单学习笔记

    列表 列表是Python中最具灵活性的有序集合对象类型.与字符串不同的是,列表可以包含任何类型的对象:数字.字符串甚至其他列表.列表是可变对象,它支持原地修改的操作. Python的列表是: 任意对象 ...

  5. python多进程并发代码_Python并发编程系列之多进程(multiprocessing)

    1引言 本篇博文主要对Python中并发编程中的多进程相关内容展开详细介绍,Python进程主要在multiprocessing模块中,本博文以multiprocessing种Process类为中心, ...

  6. python的continue用法_Python学习笔记之Break和Continue用法分析

    本文实例讲述了Python学习笔记之Break和Continue用法.分享给大家供大家参考,具体如下: Python 中的Break 和 Continue break:控制何时循环应该结束 conti ...

  7. python建立字典的程序_Python中如何创建字典Dict

    1.概述 字典也是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据,而且是Python中唯一的内建映射型数据结构. 比如有一个小学生的期末成绩,语文:79,数学:80,英语:92 ...

  8. python基础之元组定义进阶操作、字典定义进阶操作

    元组 创建元组 把所有的元素放到括号里,就是元组 创建空元组 如果定义只有一个元素的元组,那么这个元素后面要加一个逗号,告诉它我要定义的是元组 创建复杂的元组,括号内可以随便嵌套. 当然,如果嵌套的层 ...

  9. 默认是字典排序法_每日一课 | Python 进阶编程之字典的高级用法

    一. collections 中 defaultdict 的使用 1.1 字典的键映射多个值 将下面的列表转成字典 l = [('a',2),('b',3),('a',1),('b',4),('a', ...

最新文章

  1. python像素大于_用python处理图片实现图像中的像素访问
  2. vector操作小结
  3. shell脚本传可选参数 getopts 和 getopt的方法
  4. 浅析STM32之usbh_def.H
  5. input在iOS里的兼容性
  6. 前端学习(2769):发送网络请求
  7. 逆波兰式与表达式求值
  8. 完整的SQL Server邮件服务
  9. 测试总结(部分)---转载
  10. 【面经】字节算法面试三面
  11. select机制的原理
  12. wget下载github的releases的软件
  13. 前端实时可视化工具livereload安装和使用
  14. 学习计算机语言入门必看
  15. 第二章第一题(将摄氏温度转换为华氏温度)(Convert Celsius to Fahrenheit)
  16. Elasticsearch 6.X xpack安装使用详解(试用)
  17. android源码AOSP AOKP CM及下载
  18. 【采集项目-(6)全量数据采集】
  19. 【CicadaPlayer】初始化ffmpeg及设置ffmpeg日志
  20. C++OpenCV实现抠除(也可用于更换)证件照背景

热门文章

  1. 生成有控制台的WIN32程序
  2. Xposed框架实战
  3. Codeforces Beta Round #12 (Div 2 Only)【未完结】
  4. 【PAT乙级】1094 谷歌的招聘 (20 分)
  5. Python之单元测试
  6. C++之抽象基类与纯虚函数
  7. Linux上安装Nginx
  8. Oracle的NVL函数
  9. View页面间的跳转
  10. 数据库中char varchar nchar nvarchar的区别