Python字典高级用法深入分析讲解

目录
  • 一、 collections 中 defaultdict 的使用
    • 1.字典的键映射多个值
    • 2.统计字典中某个值出现的次数
  • 二、collections 创建有序字典
    • 1.改变 key-value 的顺序
    • 2.删除 key_value
  • 三、字典排序
    • 1.按照 key 进行排序
    • 2.按照 value 进行排序
  • 四、通过某个关键字排序一个字典列表

一、 collections 中 defaultdict 的使用

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 。如果你想保持元素的插入顺序就应该使用列表,如果想去掉重复元素就使用集合!

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 带来的好处要大过额外内存消耗的影响。

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.删除 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 升序(默认)。

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

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字典 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python基础之字典的详细使用教程

    目录 一. 什么是字典 二. 创建字典 三. 字典元素获取 四. 字典元素的增删改操作 五. 字典的视图操作 一. 什么是字典 字典作为Python的一个内置数据结构,和列表一样都是可变序列的,但是它是无序的,以键值对的方式存储数据. 二. 创建字典 创建字典的两种方式,一种使用{ } 另一种使用内置函数dict() # author: 爪哇斗罗(javaDouLuo) # date: 2022/7/11 22:51 # 字典的创建 dict01={"A": 1, "B&qu

  • Python中对字典的几个处理方法分享

    目录 字典求和 列表剔重并计数 获取字典中最大的value 获取字典中出现value最大的key 字典对应元素追加 字典对应元素追加并剃重 对字典进行过滤 反转字典的方法(字典的key和value对换) 合并字典 字典求和 edge_weights = defaultdict(lambda: defaultdict(float)) for idx,node in enumerate(graph.nodes()): node2com[node] = idx #给每一个节点初始化赋值一个团id fo

  • python字典排序浅析介绍

    目录 1.语法规则 1-1 代码实例 1-2 参数说明 2.对字典排序 2-1 简单示例 2-2 说明 2-3 复杂示例 2-4 说明 1.语法规则 1-1 代码实例 sorted(iterable, key=None,reverse=False) 1-2 参数说明 (1)iterable:代表的是可迭代的对象. (2)key=None:用来进行比较的元素,具体的值来源于可迭代的对象中. (3)reverse=False:排序规则,reverse=False升序(默认),reverse=True

  • Python入门之字典的使用教程

    目录 前沿 字典操作 创建字典 嵌套字典 dict() 创建字段 访问字典中的值 更新字典 删除字典元素 检查键是否存在 字典的遍历 字典函数 获取字段的长度 复制字典 批量创建键 前沿 Python字典是一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 字典的每个键值key=>value对用冒号 : 分割,每个对之间用逗号,分割,整个字典包括在花括号{}中 ,格式如下: {key1 : value1, key2 : value2 } 字典操作 创建字典 字典由键和值

  • Python字典查找数据的5个基础操作方法

    目录 前言 一.key值查找 二.函数查找 2.1 get() 2.2 keys() 2.3 values() 2.4 items() 附:字典的常用方法 总结 前言 上一篇文章写了关于字典操作方法的增删改,这篇主要讲解如何查找字典数据.查找数据写法一共有两种,一种能够是key值查找,另外一种是按照函数的写法进行数据查找. 一.key值查找 如果当前查找的key存在,则返回对应的值,否则则报错. 代码示例: dict1 = {'name': 'Rose', 'age': 30, 'sex': '

  • Python字典高级用法深入分析讲解

    目录 一. collections 中 defaultdict 的使用 1.字典的键映射多个值 2.统计字典中某个值出现的次数 二.collections 创建有序字典 1.改变 key-value 的顺序 2.删除 key_value 三.字典排序 1.按照 key 进行排序 2.按照 value 进行排序 四.通过某个关键字排序一个字典列表 一. collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [('a',2),('b',3)

  • python ChainMap管理用法实例讲解

    说明 1.ChainMap的主要用例是提供一种有效的方法来管理多个范围或上下文,并处理重复键的访问优先级. 2.当有多个存储重复键的字典访问它们的顺序时,这个功能非常有用. 在ChainMap文档中找到一个经典的例子,它模拟Python如何分析不同命名空间中的变量名称. 当Python搜索名称时,它会依次搜索当地.全局和内置的功能域,直到找到目标名称.Python作用域是将名称映射到对象的字典. 为了模拟Python的内部搜索链,可以使用链映射. 实例 >>> import builti

  • Python函数高级(命名空间、作用域、装饰器)

    目录 一.名称空间和作用域 1.命名空间(Namespace) 1.一般有三种命名空间: 2.命名空间查找顺序: 3.命名空间的生命周期: 2.作用域: 3.全局变量和局部变量 4.函数对象+作用域应用 5.global关键字修改全局作用域中的变量 6.nonlocal关键字修改嵌套作用域中的变量. 二.闭包函数 应用领域: 三.函数装饰器 四.无参装饰器 1.被装饰函数有返回值: 2.被装饰函数需要传参: 3.装饰器模板 4.装饰器语法糖: 五.带参数的装饰器 3.有参三层装饰器: 六.类装饰

  • python中dict()的高级用法实现

    collections中defaultdict的用法 一.字典的键映射多个值 将下面的列表转换成字典 一个字典就是一个键对应一个单值得映射,而上面的列表中有相同的键,如果你想要一个键映射多个值,那么就需要将这多个值放到另外的序列中,比如list或者set里面,像下面这样: 你可以很方便的使用 collections 模块中的 defaultdict 来构造这样的字典. defaultdict 的一个特征是它会自动初始化每个 key 刚开始对应的值. 当然这个默认的容器不一定是 list, 也可以

  • 全网最细 Python 格式化输出用法讲解(推荐)

    一.使用 print() 函数 在 Python 中,print() 函数支持格式化输出,与 C 语言的 printf 类似. 1. 格式化输出字符串和整数 [示例1]输出字符串 AmoXiang,并计算.输出它的字符长度 str1 = "%s.length = %d" % ("AmoXiang", len("AmoXiang")) print(str1) # 输出AmoXiang.length = 8 % 在字符串中表示格式化操作符,它后面必须

  • Python进阶之高级用法详细总结

    一.Lambda表达式 Lambda表达式又被称之为匿名函数 格式 lambda 参数列表:函数体 def add(x,y): return x+y print(add(3,4)) #上面的函数可以写成Lambda函数 add_lambda=lambda x,y:x+y add_lambda(3,4) 二.map函数 函数就是有输入和输出,map的输入和输出对应关系如下图所示: 就是要把一个可迭代的对象按某个规则映射到新的对象上. 因此map函数要有两个参数,一个是映射规则,一个是可迭代对象.

  • python字典get()方法用法分析

    本文实例讲述了python字典get()方法用法.分享给大家供大家参考.具体分析如下: 如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 这里给大家分享的就是字典的get()方法. 这里我们可以用字典做一个小游戏,假设用户在终端输入字符串:"1"或者是"2"或者是"3",返回对应的内容,如果是输入其他的,则返回"error" >>> info

  • Python字典简介以及用法详解

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ 老规矩以下方法环境2.7.x,请3.x以上版本的朋友记得格式print(输出内容放入括号内) 字典的基本组成以及用法 dict = { key : value } dict[ key ] = value 首先来说说字典是由key键与value值一一对应来组成字典的基本结构 key键不能由list列表,dict字典等多元素命名, key是唯一属性又可以称一对一服务,key相同但只会

  • python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成.字典的键必须是不可改变的类型,如:字符串,数字,tuple:值可以为任何python数据类型. 1.新建字典 >>> dict1={} #建立一个空字典 >>> type(dict1) <type 'dict'> 2.增加字典元素:两种方法 >>&g

  • Python字典实现简单的三级菜单(实例讲解)

    如下所示: data = { "北京":{ "昌平":{"沙河":["oldboy","test"],"天通苑":["链接地产","我爱我家"]}, "朝阳":{"望京":["奔驰","陌陌"],"国贸":["CICC",&quo

随机推荐