擅长:python、mysql、java
<p>像这样的方法很有效:</p>
<pre><code>def alternate(*iterables):
iterators = [iter(iterable) for iterable in iterables]
sentinel = object()
keep_going = True
while keep_going:
keep_going = False
for iterator in iterators:
maybe_yield = next(iterator, sentinel)
if maybe_yield != sentinel:
keep_going = True
yield maybe_yield
print ''.join(alternate('abcde','fg','hijk'))
</code></pre>
<p>诀窍是意识到当生成器耗尽时,<code>next</code>将返回sentinel值。只要一个迭代器返回一个sentinel,那么我们就需要继续下去,直到它耗尽为止。如果sentinel没有从<code>next</code>返回,那么该值是正确的,我们需要生成它。在</p>
<p>请注意,如果iterable的数量很大,则此实现是次优的(最好将iterable存储在支持O(1)删除的数据结构中,并在检测到iterable耗尽时立即将其删除,因此可以使用<code>collections.OrderedDict</code>,但我将把它留给感兴趣的读者作为练习)。在</p>
<hr/>
<p>如果我们想打开标准库,<code>itertools</code>也可以在这里提供帮助:</p>
^{pr2}$
<p>这里,我返回一个生成器表达式。。。这与编写一个生成器函数略有不同,但实际上没有多大区别:-)。再一次,如果有很多iterable,并且其中一个iterable比其他的长很多(考虑这样的情况,长度为1的iterable为100个,长度为101的iterable,则效率为101*101步,而实际上应该能够在101*2+1步中完成迭代)。在</p>