将列表字典转换为字典列表的Pythonic方法
Pythonic way of converting dict of lists to list of dicts
我有以下数据结构:
[('dim1', ['All', 'All', 'All']),
('dim2', ['100', '100', '100']),
('min', [1500, 1200, 1300]),
('max', [2500, 2200, 2000]),
('kpi', ['Avg prod', 'Avg prod', 'Sales'])]
我想要以下内容:
[{'dim1': 'All', 'dim2': '100', 'min': 1500, 'max': 2500, 'kpi': 'Avg prod'},
{'dim1': 'All', 'dim2': '100', 'min': 1200, 'max': 2200, 'kpi': 'Avg prod'},
{'dim1': 'All', 'dim2': '100', 'min': 1300, 'max': 2000, 'kpi': 'Avg Sales'}]
我想很好地实现这个 pythonic 并尽可能避免嵌套循环。谢谢!
使用zip
and list comprehension:
>>> lst = [
... ('dim1', ['All', 'All', 'All']),
... ('dim2', ['100', '100', '100']),
... ('min', [1500, 1200, 1300]),
... ('max', [2500, 2200, 2000]),
... ('kpi', ['Avg prod', 'Avg prod', 'Sales'])
... ]
>>>
>>> keys, values = zip(*lst)
>>> [dict(zip(keys, vs)) for vs in zip(*values)]
[{'dim1': 'All', 'max': 2500, 'dim2': '100', 'kpi': 'Avg prod', 'min': 1500},
{'dim1': 'All', 'max': 2200, 'dim2': '100', 'kpi': 'Avg prod', 'min': 1200},
{'dim1': 'All', 'max': 2000, 'dim2': '100', 'kpi': 'Sales', 'min': 1300}]
一线:
data = [('dim1', ['All', 'All', 'All']),
('dim2', ['100', '100', '100']),
('min', [1500, 1200, 1300]),
('max', [2500, 2200, 2000]),
('kpi', ['Avg prod', 'Avg prod', 'Sales'])]
result = (lambda h, l: [dict(zip(h, i)) for i in zip(*l)])(*zip(*data))
*这实际上与我独立得出的 faltru 的答案相同,只是应用程序带有 lambda。
Python初学者:
- 因为列表元素中的每第二个项目都有
length 3
。使用for loop
通过range()
方法迭代3次。
- 由于输出列表的每个元素类型都是字典。所以定义字典即
tmp={}
。
- 因为我们要将每个输入列表元素添加到 tmp 字典中。
- 将 tmp 附加到输出列表。
- 打印最终输出列表。
代码:
input = [('dim1', ['All', 'All', 'All']),
('dim2', ['100', '100', '100']),
('min', [1500, 1200, 1300]),
('max', [2500, 2200, 2000]),
('kpi', ['Avg prod', 'Avg prod', 'Sales'])]
output = []
for i in range(0,3):
tmp = {}
for j in input:
tmp[j[0]] = j[1][i]
output.append(tmp)
import pprint
pprint.pprint(output)
输出:
vivek@vivek:~/Desktop/Whosebug$ python 11.py
[{'dim1': 'All', 'dim2': '100', 'kpi': 'Avg prod', 'max': 2500, 'min': 1500},
{'dim1': 'All', 'dim2': '100', 'kpi': 'Avg prod', 'max': 2200, 'min': 1200},
{'dim1': 'All', 'dim2': '100', 'kpi': 'Sales', 'max': 2000, 'min': 1300}]
我有以下数据结构:
[('dim1', ['All', 'All', 'All']),
('dim2', ['100', '100', '100']),
('min', [1500, 1200, 1300]),
('max', [2500, 2200, 2000]),
('kpi', ['Avg prod', 'Avg prod', 'Sales'])]
我想要以下内容:
[{'dim1': 'All', 'dim2': '100', 'min': 1500, 'max': 2500, 'kpi': 'Avg prod'},
{'dim1': 'All', 'dim2': '100', 'min': 1200, 'max': 2200, 'kpi': 'Avg prod'},
{'dim1': 'All', 'dim2': '100', 'min': 1300, 'max': 2000, 'kpi': 'Avg Sales'}]
我想很好地实现这个 pythonic 并尽可能避免嵌套循环。谢谢!
使用zip
and list comprehension:
>>> lst = [
... ('dim1', ['All', 'All', 'All']),
... ('dim2', ['100', '100', '100']),
... ('min', [1500, 1200, 1300]),
... ('max', [2500, 2200, 2000]),
... ('kpi', ['Avg prod', 'Avg prod', 'Sales'])
... ]
>>>
>>> keys, values = zip(*lst)
>>> [dict(zip(keys, vs)) for vs in zip(*values)]
[{'dim1': 'All', 'max': 2500, 'dim2': '100', 'kpi': 'Avg prod', 'min': 1500},
{'dim1': 'All', 'max': 2200, 'dim2': '100', 'kpi': 'Avg prod', 'min': 1200},
{'dim1': 'All', 'max': 2000, 'dim2': '100', 'kpi': 'Sales', 'min': 1300}]
一线:
data = [('dim1', ['All', 'All', 'All']),
('dim2', ['100', '100', '100']),
('min', [1500, 1200, 1300]),
('max', [2500, 2200, 2000]),
('kpi', ['Avg prod', 'Avg prod', 'Sales'])]
result = (lambda h, l: [dict(zip(h, i)) for i in zip(*l)])(*zip(*data))
*这实际上与我独立得出的 faltru 的答案相同,只是应用程序带有 lambda。
Python初学者:
- 因为列表元素中的每第二个项目都有
length 3
。使用for loop
通过range()
方法迭代3次。 - 由于输出列表的每个元素类型都是字典。所以定义字典即
tmp={}
。 - 因为我们要将每个输入列表元素添加到 tmp 字典中。
- 将 tmp 附加到输出列表。
- 打印最终输出列表。
代码:
input = [('dim1', ['All', 'All', 'All']),
('dim2', ['100', '100', '100']),
('min', [1500, 1200, 1300]),
('max', [2500, 2200, 2000]),
('kpi', ['Avg prod', 'Avg prod', 'Sales'])]
output = []
for i in range(0,3):
tmp = {}
for j in input:
tmp[j[0]] = j[1][i]
output.append(tmp)
import pprint
pprint.pprint(output)
输出:
vivek@vivek:~/Desktop/Whosebug$ python 11.py
[{'dim1': 'All', 'dim2': '100', 'kpi': 'Avg prod', 'max': 2500, 'min': 1500},
{'dim1': 'All', 'dim2': '100', 'kpi': 'Avg prod', 'max': 2200, 'min': 1200},
{'dim1': 'All', 'dim2': '100', 'kpi': 'Sales', 'max': 2000, 'min': 1300}]