<p>这个怎么样:</p>
<pre><code>from itertools import zip_longest
lists = [[1, 2, 3, 4], [5, 6], [7, 8, 9], [11, 33]]
for item in [x for t in zip_longest(*lists) for x in t]:
if item is not None:
print(item)
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>1
5
7
11
2
6
8
33
3
9
4
</code></pre>
<p>或者只是将其作为列表:</p>
<pre><code>items = [x for t in zip_longest(*lists) for x in t if x is not None]
</code></pre>
<p>注意:@MarkM做了一个值得注意的评论-如果您的源数据包含<code>None</code>,此方法将有一个问题,因为它将过滤掉它们。您应该告诉<code>zip_longest</code>使用不同的<code>fillvalue</code>,在这种情况下,它不会显示在您的数据中。例如:</p>
<pre><code>items = [x for t in zip_longest(*lists, fillvalue='') for x in t if x is not None]
</code></pre>
<p>如果由于非常具体的原因(如注释中所述)无法导入<code>itertools</code>,则可以使用文档(<a href="https://docs.python.org/3/library/itertools.html#itertools.zip_longest" rel="nofollow noreferrer">https://docs.python.org/3/library/itertools.html#itertools.zip_longest</a>)中所示的实现:</p>
<pre><code>def repeat(object, times=None):
if times is None:
while True:
yield object
else:
for i in range(times):
yield object
def zip_longest(*args, fillvalue=None):
iterators = [iter(it) for it in args]
num_active = len(iterators)
if not num_active:
return
while True:
values = []
for i, it in enumerate(iterators):
try:
value = next(it)
except StopIteration:
num_active -= 1
if not num_active:
return
iterators[i] = repeat(fillvalue)
value = fillvalue
values.append(value)
yield tuple(values)
</code></pre>