Pythonic способ перебирать списки внутри dict параллельно как dict

1

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

но кажется, что есть более чистый, более эффективный - питонический способ сделать это.

Похожие вопросы:

  • это явно не означало итерацию над списками, содержащимися в диктовке, конкретно об этом,
  • это не связано с параллельными списками внутри dict,
  • это не связано с диктофонами.
Теги:
dictionary

1 ответ

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'}]
  • 0
    Я знаю об этом, но это не дает мне промежуточного мнения. pack должен быть {'names': 'a', 'values': 'A'} во время каждой итерации (пример приведен для первого итератора). Я выделю соответствующее предложение в моем вопросе, чтобы прояснить это.
  • 1
    Обновленный фрагмент это то, что вы хотите?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню