本文首发于知乎

本文分为如下部分

  • 列表转置
  • 字典转置
  • 字典列表之间的转换
  • 总结

列表转置

已有

l = [['a', 'b', 'c'],[1, 2, 3]]
复制代码

想得到

[('a', 1), ('b', 2), ('c', 3)]
复制代码

代码如下

[z for z in zip(*l)]
复制代码

zip函数在list的转置中充当重要作用,它的基础用法是这样的

for z in zip(['a', 'b', 'c'], [1, 2, 3]):print(z)# 输出
('a', 1)
('b', 2)
('c', 3)
复制代码

字典的转置

已有

m = {'Bob': {'age': 30, 'country': 'America'},'Mary': {'age': 20, 'country': 'China'},'Frank': {'age': 25, 'country': 'America'}}
复制代码

想得到

{'age': {'Bob': 30, 'Frank': 25, 'Mary': 20},'country': {'Bob': 'America', 'Frank': 'America', 'Mary': 'China'}}
复制代码

如果借用pandas直接转置即可

>>> m = {'Bob': {'age': 30, 'country': 'America'},
...      'Mary': {'age': 20, 'country': 'China'},
...      'Frank': {'age': 25, 'country': 'America'}}
>>>
>>> import pandas as pd
>>> pd.DataFrame(m)Bob    Frank   Mary
age           30       25     20
country  America  America  China
>>> pd.DataFrame(m).transpose()age  country
Bob    30  America
Frank  25  America
Mary   20    China
>>> pd.DataFrame(m).transpose().to_dict()
{'age': {'Mary': 20, 'Bob': 30, 'Frank': 25}, 'country': {'Mary': 'China', 'Bob': 'America', 'Frank': 'America'}}
复制代码

如果我们单独使用字典的知识也是可以办到的

from collections import defaultdict
result = defaultdict(dict)
for names, infos in m.items():for k, v in infos.items():result[k].update({names: v})dict(result)
复制代码

字典列表之间的转换

已有

d = {'name': ['a', 'b', 'c'],'num': [1, 2, 3]}
复制代码

想要得到

[('a', 1), ('b', 2), ('c', 3)][{'name': 'a', 'num': 1}, {'name': 'b', 'num': 2},{'name': 'c', 'num': 3}]
复制代码

两种形式

代码如下

# 第一个
[z for z in zip(*d.values())]# 第二个
[dict(zip(d.keys(), z)) for z in zip(*d.values())]
# 或
[dict(zip(d, z)) for z in zip(*d.values())]
复制代码

总结

首先来看一下我们遇到了哪些形式的数据

{'name' : ['a', 'b', 'c'],'num' : [1, 2, 3]}{'Bob': {'age': 30, 'country': 'America'},'Mary': {'age': 20, 'country': 'China'},'Frank': {'age': 25, 'country': 'America'}}{'age': {'Bob': 30, 'Frank': 25, 'Mary': 20},'country': {'Bob': 'America', 'Frank': 'America', 'Mary': 'China'}}[('a', 1), ('b', 2), ('c', 3)]
[{'a', 1}, {'b', 2}, {'c', 3}]
[{'a': 1}, {'b': 2}, {'c': 3}]
[{'name': 'Bob', 'age': 30, 'country': 'America'},{'name': 'Mary', 'age': 20, 'country': 'China'},{'name': 'Frank', 'age': 25, 'country': 'America'}]
复制代码

下面总结一下看待字典列表的思想

  • 首先,最重要的是列表这种结构,将集合、元组都看做列表(无序等都是细枝末节)
  • 而字典可以看做特殊的列表,即对每个元素都命名了的列表,键是名,值相当于列表的元素

读者可以试着使用这种思想去看上面这些数据,就会明白,为什么某些数据直接可以用pd.DataFrame转化为数据框,他们都相当于二维列表形成的矩阵。一个维度,如果以列表形式呈现则视为行,如果以字典形式呈现则视为列。

这些数据的相互转化中,只要根据要生成结果的形式,记住几个套路即可:

1.如果结果是一个字典,简单的用字典生成式等方式不谈。当值是动态更新的时候,则使用collections模块中的defaultdict设置值的类型,使用循环填入数据,如果值类型是list则用append方法填入,如果是dict则用update方法填入。

注:有时结果是字典会直接人为指定键,值用列表生成式等直接获得,这是一种比较不通用的做法,因为需要人为指定键的话,就无法将其改装为一个适合各种情况的函数了。

2.如果结果是一个列表,则用列表生成式,构造每一个元素的形式即可

3.如果涉及到了转置问题,其实本质上都是列表的转置,往zip函数那里想,有时也可以用defaultdict

欢迎关注我的知乎专栏

专栏主页:python编程

专栏目录:目录

版本说明:软件及包版本说明

玩转python字典与列表(下)相关推荐

  1. python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

    1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...

  2. python 字典、列表、字符串 之间的转换

    文章目录 列表与字符串转换 列表转字符串: 将列表中的内容拼接成一个字符串 将列表中的值转成字符串 字符串转列表: 将字符串每个字符转成列表中的值 将字符串按分割成列表 列表与字典转换 列表转字典: ...

  3. python字典嵌套列表怎么访问值的某个元素_通过键列表访问嵌套字典项?

    使用reduce()翻阅字典:from functools import reduce  # forward compatibility for Python 3import operatordef  ...

  4. python字典添加列表_【Python】对字典列表进行去重追加

    [TOC] 目标 现有字典列表 # A = [ {dict1}, {dict2} ] B = [ {dict3}, {dict2} ] C = [ {dict3}, {dict4} ] M = [A, ...

  5. python字典转换为列表_Python中将字典转换为列表的方法

    说明:列表不可以转换为字典 ①转换后的列表为无序列表 a = {'a' : 1, 'b': 2, 'c' : 3} #字典中的key转换为列表 key_value = list(a.keys()) p ...

  6. python 字典、列表、字符串 之间的相互转换

    1.列表与字符串转换 列表转字符串: 将列表中的内容拼接成一个字符串 将列表中的值转成字符串 字符串转列表: 用eval转换 将字符串每个字符转成列表中的值 将字符串按分割成列表 2.列表与字典转换 ...

  7. python pop函数 索引_[python] 字典和列表中的pop()函数

    在字典和列表中,pop()函数都是删除特定元素,并将删除的元素返回给指定的变量或丢弃 一.字典元素删除 1.1 clear() 语法:dict.clear() 1 x = {'a':1, 'b':2, ...

  8. python字典、列表、元祖使用场景_(三)PYTHON字典 元祖 列表尝试应用

    1. 使用 join 方法将下划线添加到列表的每一个元素拼接成字符串,li = ['alex', 'eric', 'rain'] li = ['boom', 'TNT', 'zhadan'] dayi ...

  9. python字典、列表、元祖使用场景_python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍...

    python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍 一丶元祖 1.元祖简介 元祖跟列表类似.只不过是有区别的. 如下: tuple(元祖英文) 跟列表类似, 元素不能 ...

最新文章

  1. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence
  2. mysql表自关联_数据库之自关联
  3. Mac系统git clone 慢【解决方案】
  4. 农保和社保的区别有哪些
  5. 写在前面,白话 Yaf 探秘与深入
  6. 如何使用SAP Fiori Launchpad Designer
  7. 03:数据结构 栈、队列、链表与数组
  8. document.elementFromPoint
  9. 2021牛客暑期多校训练营6 :D Gambling Monster 期望dp + fwt + cdq分治
  10. 查看mysql表的数据和结构
  11. 高德车道级导航已上线8城 新增支持小米11 Pro
  12. Android 使用 Gradle 打包 - 签名配置
  13. Android进阶(二) Activity调用Service 通过AIDL实现
  14. Tapestry5.3使用总结
  15. 模拟电子技术基础简明课程(第三版)思维导图
  16. 易用宝项目记录day5-shiro
  17. 整理:Github上最受欢迎的仓库(截至2021年12月26日)
  18. 快速部署支持 Makedown 和 LaTeX 等格式的 Zbox-Wiki 文档共享站点
  19. 【Docker】No defult Boot2Docer ISO异常
  20. 绿色建筑、装配式建筑工作加速推进,建筑行业招聘需求急速飞升

热门文章

  1. 如何保障MySQL主从复制关系的稳定性?关键词(新特性、crash-safe)
  2. 项目Beta冲刺Day4
  3. VC双缓冲画图技术介绍
  4. 冷知识 —— 文学(名与字)
  5. 西安力邦智能医疗amp;可穿戴设备沙龙--第1期---苹果HealthKit、谷歌GoogleFit来袭,智能医疗要爆发吗?...
  6. 程序员鼓励师是什么?
  7. 保存画面为图片 当前MFC保存该程序为图片 c++ vc
  8. selenium(待补充)
  9. WINRAR 命令行语法[转载]
  10. 读caffe源码:gflags的使用