<p>我们可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.cycle" rel="nofollow noreferrer">^{<cd1>}</a>来重复这些键。然后我们需要一个列表理解,考虑到关键列表的长度,我们就完成了</p>
<pre><code>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)
</code></pre>
<hr/>
<p>更具可读性的方法,采用<a href="https://stackoverflow.com/a/312464/1209921">"chunks" recipe from this StackOverflow answer</a></p>
<pre><code>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)
</code></pre>
<hr/>
<p>最后一次修复。如果我们不想通过使用<code>data = list(zip(cycle(list_keys), list_values))</code>创建一个列表来消耗内存,那么有一种方法可以从使用<code>zip</code>得到的iterable中创建块。我们必须为此进口<a href="https://docs.python.org/3/library/itertools.html#itertools.islice" rel="nofollow noreferrer">^{<cd4>}</a>。我只是列出对上一个版本的更改</p>
<pre><code>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
</code></pre>