将两个列表映射为一个字典列表

6 投票
8 回答
2044 浏览
提问于 2025-04-11 09:30

假设我有这些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)]

撰写回答