<p>可以使用<a href="https://docs.python.org/3/library/itertools.html#itertools.chain.from_iterable" rel="nofollow noreferrer">^{<cd1>}</a>展平序列,并使用生成器表达式筛选出<code>None</code>值:</p>
<pre><code>from itertools import chain, zip_longest
it = (v for v in chain.from_iterable(zip_longest(l1, l2)) if v is not None)
</code></pre>
<p>您可能不想使用<code>None</code>作为sentinel值,而是希望使用专用的sentinel,以便可以在输入列表中使用<code>None</code>:</p>
^{pr2}$
<p>如果要筛选出<a href="https://docs.python.org/3/library/stdtypes.html#truth" rel="nofollow noreferrer"><em>falsey</em> values</a>,则还可以使用<a href="https://docs.python.org/3/library/functions.html#filter" rel="nofollow noreferrer">^{<cd5>}</a>:</p>
<pre><code>it = filter(None, chain.from_iterable(zip_longest(l1, l2)))
</code></pre>
<p>演示:</p>
<pre><code>>>> from itertools import chain, zip_longest
>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = ['a', 'b', 'c', 'd']
>>> it = (v for v in chain.from_iterable(zip_longest(l1, l2)) if v is not None)
>>> list(it)
[1, 'a', 2, 'b', 3, 'c', 4, 'd', 5, 6]
</code></pre>
<p>还有当地的哨兵:</p>
<pre><code>>>> l1 = [1, None, 2, None, 3, None]
>>> l2 = ['a', 'b', 'c', 'd']
>>> _sentinel = object()
>>> flattened = chain.from_iterable(zip_longest(l1, l2, fillvalue=_sentinel))
>>> it = (v for v in flattened if v is not _sentinel)
>>> list(it)
[1, 'a', None, 'b', 2, 'c', None, 'd', 3, None]
</code></pre>
<p><a href="https://docs.python.org/3/library/itertools.html#itertools-recipes" rel="nofollow noreferrer">^{<cd6>} recipes section</a>还具有:</p>
<pre><code>def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') > A D E B F C"
# Recipe credited to George Sakkis
num_active = len(iterables)
nexts = cycle(iter(it).__next__ for it in iterables)
while num_active:
try:
for next in nexts:
yield next()
except StopIteration:
# Remove the iterator we just exhausted from the cycle.
num_active -= 1
nexts = cycle(islice(nexts, num_active))
</code></pre>