创建一个包含字典的列表,这些字典的值是从其他列表中顺序选择的

时间:2019-05-09 09:17:45

标签: python python-3.x

我正在尝试创建一个词典列表,该词典由相同的键和从不同列表中顺序选择的值配对而成。

这里的解决方案对我没有帮助: Creating a unique list of dictionaries from a list of dictionaries which contains same keys but different values

One liner: creating a dictionary from list with indices as keys

Create dictionary from list python

ids = [8, 9, 10, 11, 12]
field = ['person']
container = []

我最近得到的是:

for i in ids:
    container.append(dict(zip(field, [i for i in ids])))

这将导致:

[{'person': 8}, {'person': 8}, {'person': 8}, {'person': 8}, {'person': 8}]

我需要什么:

[{'person': 8}, {'person': 9}, {'person': 10}, {'person': 11}, {'person': 12}]

4 个答案:

答案 0 :(得分:2)

如果您有一个字段,则可以执行以下操作:

for i in ids:
    container.append(dict(zip(field, [i])))

对于多个字段项目,您可以执行以下操作:

from itertools import product
for i,j in product(ids, field):
    container.append(dict(zip([i],[j])))

答案 1 :(得分:1)

如果zip仅包含一个元素,而您已经在进行列表理解了,为什么还要对field感到烦恼?

container = [{field[0]: i} for i in ids]

答案 2 :(得分:1)

您已经在ids循环中对for进行了迭代,您也不需要列表理解。

您不需要zip。它没有做任何有用的事情,因为它总是在到达最短序列的末尾时停止。由于field仅包含一个元素,因此仅使用[i for i in ids]的第一个元素,这就是为什么您总是得到8的原因。

for i in ids:
    container.append({field[0]: i})

答案 3 :(得分:1)

如果ID是连续且连续的(您提到了顺序选择的值),则可以使用range,此外,如果字段列表中只有一个元素,为什么不直接使用字符串。

然后这是一个简单的单线纸

print([{'person': i} for i in range(8, 13)])
#[{'person': 8}, {'person': 9}, {'person': 10}, {'person': 11}, {'person': 12}]

如果列表中有多个元素,那么您将不需要zip

fields = ['person', 'animal']
print([{item: i} for i in range(8, 13) for item in fields])
#[{'person': 8}, {'animal': 8}, {'person': 9}, {'animal': 9}, {'person': 10}, {'animal': 10}, {'person': 11}, {'animal': 11}, {'person': 12}, {'animal': 12}]

另一种选择是itertools.product

from itertools import product
ids = [8, 9, 10, 11, 12]
field = ['person']
print([{item[0]: item[1]} for item in product(field, ids)])
#[{'person': 8}, {'person': 9}, {'person': 10}, {'person': 11}, {'person': 12}]
from itertools import product
ids = [8, 9, 10, 11, 12]
field = ['person', 'field']
print([{item[0]: item[1]} for item in product(field, ids)])
#[{'person': 8}, {'person': 9}, {'person': 10}, {'person': 11}, {'person': 12}, {'field': 8}, {'field': 9}, {'field': 10}, {'field': 11}, {'field': 12}]