В ответе Конрад Рудольф
Zip почти делает то, что вы хотите; к сожалению, вместо того, чтобы ездить на велосипеде по более короткому списку, он ломается. Возможно, есть связанная функция, которая циклически повторяется?
Вот способ:
keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
iter_values = iter(values)
[dict(zip(keys, iter_values)) for _ in range(len(values) // len(keys))]
Я не буду называть это Pythonic (я думаю, что это слишком умно), но это может быть то, что ищут.
Нет смысла зацикливать список keys
, используя itertools
.cycle()
, поскольку каждый обход keys
соответствует созданию одного словаря.
РЕДАКТИРОВАТЬ: Вот еще один способ:
def iter_cut(seq, size):
for i in range(len(seq) / size):
yield seq[i*size:(i+1)*size]
keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
[dict(zip(keys, some_values)) for some_values in iter_cut(values, len(keys))]
Это гораздо более питонно: есть читаемая служебная функция с ясной целью, а остальная часть кода естественно вытекает из нее.