Pythonic方法迭代字典中的列表并行作为字典

时间:2018-06-15 11:21:45

标签: python dictionary

我意识到这个问题的标题可能不会立即超级明确,所以在一个例子中: 我的dict包含如下列表(假设其中没有其他内容):

packed = {
    'names': ['a', 'b', 'c', 'd'],
    'values': ['A', 'B', 'C', 'D']
}

我想做的是并行迭代每个列表(尽可能多的列表),但是在每次迭代中我有一个dict,每个列表都有一个元素。我想象这样的事情:

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

我意识到这可以通过显式迭代一个子列表的长度并在每次迭代期间构造一个dict来完成:

for i in range(len(packed.values()[0])):
    pack = dict(zip(packed.keys(),[v[i] for v in packed.values()]))

但感觉有一种更干净,更有效 - pythonic - 这样做的方法。

类似的问题:

  • this没有明确涉及迭代字典中包含的列表 - 我的具体是关于它,
  • this并未涉及字典中的并行列表,
  • this没有涉及dicts。

1 个答案:

答案 0 :(得分:3)

您可以使用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'}]
相关问题