本文首发于知乎python
本文分为以下部分编程
已有bash
l = [['a', 'b', 'c'],
[1, 2, 3]]
复制代码
想获得app
[('a', 1), ('b', 2), ('c', 3)]
复制代码
代码以下函数
[z for z in zip(*l)]
复制代码
zip
函数在list的转置中充当重要做用,它的基础用法是这样的ui
for z in zip(['a', 'b', 'c'], [1, 2, 3]):
print(z)
# 输出
('a', 1)
('b', 2)
('c', 3)
复制代码
已有spa
m = {'Bob': {'age': 30, 'country': 'America'},
'Mary': {'age': 20, 'country': 'China'},
'Frank': {'age': 25, 'country': 'America'}}
复制代码
想获得code
{'age': {'Bob': 30, 'Frank': 25, 'Mary': 20},
'country': {'Bob': 'America', 'Frank': 'America', 'Mary': 'China'}}
复制代码
若是借用pandas直接转置便可ip
>>> 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'}}
复制代码
若是咱们单独使用字典的知识也是能够办到的get
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编程
专栏目录:目录
版本说明:软件及包版本说明