【问题标题】:Pythonic way to iterate over lists inside a dict in parallel AS a dict以 Python 方式并行迭代字典内的列表作为字典
【发布时间】:2018-06-15 11:21:45
【问题描述】:

我意识到这个问题的标题可能不是很清楚,所以举个例子:
我的 dict 包含如下列表(假设其中没有其他内容):

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 - 可以做到这一点。

类似问题:

  • this 并没有明确涉及迭代包含在 dict 中的列表 - 我专门针对它,
  • this 不涉及字典中的并行列表,
  • this 不涉及字典。

【问题讨论】:

标签: python dictionary


【解决方案1】:

你可以直接使用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'}]

【讨论】:

  • 我知道这一点,但这并没有给我一个中间的字典。在每次迭代期间,pack 应该是 {'names': 'a', 'values': 'A'}(给出第一个迭代的示例)。我将在我的问题中突出显示相关句子以使其更清楚。
  • 更新的 sn-p 是你想要的吗?
  • 是的!单行列表理解特别漂亮。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2019-07-28
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多