将两个列表映射为一个字典列表
假设我有这些Python列表:
keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
有没有一种直接或者至少简单的方法来生成下面这个字典列表呢?
[
{'name': 'Monty', 'age': 42},
{'name': 'Matt', 'age': 28},
{'name': 'Frank', 'age': 33}
]
8 个回答
2
在Konrad Rudolph的回答中
zip几乎可以满足你的需求;但不幸的是,它不会循环使用较短的列表,而是会停止。也许有其他相关的函数可以实现循环?
这里有一种方法:
keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
iter_values = iter(values)
[dict(zip(keys, iter_values)) for _ in range(len(values) // len(keys))]
我不会称它为Pythonic(我觉得它有点聪明过头),但这可能正是你在寻找的。
使用itertools
.cycle()
来循环keys
列表没有什么好处,因为每次遍历keys
都会创建一个字典。
编辑:这里还有另一种方法:
def iter_cut(seq, size):
for i in range(len(seq) / size):
yield seq[i*size:(i+1)*size]
keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
[dict(zip(keys, some_values)) for some_values in iter_cut(values, len(keys))]
这更符合Python的风格:有一个可读性强的工具函数,目的明确,其他代码也自然地从这个函数中流出。
3
这段代码看起来不太美观,但它用了一行代码实现了功能,使用了列表推导、zip函数和步进的方式:
[dict(zip(keys, a)) for a in zip(values[::2], values[1::2])]
14
这里有个简单的方法
def mapper(keys, values):
n = len(keys)
return [dict(zip(keys, values[i:i + n]))
for i in range(0, len(values), n)]