我正在尝试创建一个词典列表,该词典由相同的键和从不同列表中顺序选择的值配对而成。
这里的解决方案对我没有帮助: 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}]
答案 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}]