Я понимаю, что название этого вопроса может быть не сразу предельно ясным, поэтому на примере:
Мой 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()]))
но кажется, что есть более чистый, более эффективный - питонический способ сделать это.
Похожие вопросы:
Вы можете напрямую использовать 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'}
во время каждой итерации (пример приведен для первого итератора). Я выделю соответствующее предложение в моем вопросе, чтобы прояснить это.