我们可以使用itertools.cycle 来重复按键。然后我们需要一个列表推导来考虑键列表的长度,然后我们就完成了。
from itertools import cycle
list_values = ['event1', 'location1', 'time1', 'event2', 'location2', 'time2',
'event3', 'location3', 'time3', 'event4', 'location4', 'time4']
list_keys = ['event', 'location', 'time']
data = list(zip(cycle(list_keys), list_values))
result = [dict(data[i:i+len(list_keys)]) for i in range(len(data))[::len(list_keys)] ]
print(result)
一种更易读的方法,采用"chunks" recipe from this StackOverflow answer。
from itertools import cycle
list_values = ['event1', 'location1', 'time1', 'event2', 'location2', 'time2', 'event3', 'location3', 'time3',
'event4', 'location4', 'time4']
list_keys = ['event', 'location', 'time']
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]
data = list(zip(cycle(list_keys), list_values))
result = [dict(chunk) for chunk in chunks(data, len(list_keys))]
print(result)
最后一次修复。如果我们不想通过使用data = list(zip(cycle(list_keys), list_values)) 创建一个列表来耗尽内存,那么有一种方法可以从我们使用zip 获得的可迭代对象中创建块。为此,我们必须导入 islice。我只是列出了对上一个版本的更改。
from itertools import cycle, islice # added islice
def chunks(iterable, n): # new chunk function
iterable = iter(iterable)
return iter(lambda: list(islice(iterable, n)), [])
data = zip(cycle(list_keys), list_values) # no more list