我意识到这个问题的标题可能不会立即非常清晰,所以举个例子:
我的字典包含如下列表(假设其中没有其他内容(:
packed = {
'names': ['a', 'b', 'c', 'd'],
'values': ['A', 'B', 'C', 'D']
}
我想做的是并行迭代这些列表中的每一个(尽可能多的列表(,但是在每次迭代期间,我都有一个字典,其中包含每个列表的单个元素。我想象的是这样的:
for pack in smartIterate(packed): #how to "smartIterate"?
print(pack['names'], pack['values'])
#pack is equal to {'names':'a', 'values':'A'} in the first iteration
打印出来:
a, A
b, B
c, C
d, D
我意识到这可以通过显式迭代一个子列表的长度并在每次迭代期间构造一个字典来完成:
for i in range(len(packed.values()[0])):
pack = dict(zip(packed.keys(),[v[i] for v in packed.values()]))
但感觉有一种更干净,更高效的Pythonic方法可以做到这一点。
类似问题:
- 这显然不涉及迭代字典中包含的列表 - 我的是专门关于它的,
- 这不涉及字典中的并行列表,
- 这不涉及字典。
您可以直接将zip
与dict.values
一起使用
前任:
packed = {
'names': ['a', 'b', 'c', 'd'],
'values': ['A', 'B', 'C', 'D']
}
keysValue = packed.keys()
for pack in zip(*packed.values()):
print( dict(zip(keysValue, pack)) )
输出:
{'values': 'A', 'names': 'a'}
{'values': 'B', 'names': 'b'}
{'values': 'C', 'names': 'c'}
{'values': 'D', 'names': 'd'}
或者使用列表理解的一行
keysValue = packed.keys()
print( [dict(zip(keysValue, pack)) for pack in zip(*packed.values())] )
#[{'values': 'A', 'names': 'a'}, {'values': 'B', 'names': 'b'}, {'values': 'C', 'names': 'c'}, {'values': 'D', 'names': 'd'}]