使用roundrobin
recipe從itertools:
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
pending = len(iterables)
nexts = cycle(iter(it).next for it in iterables)
while pending:
try:
for next in nexts:
yield next()
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
演示:
>>> x = ['abc', 'd', 'efgh']
>>> from itertools import cycle, islice
>>> list(roundrobin(*x))
['a', 'd', 'e', 'b', 'f', 'c', 'g', 'h']
另一種選擇是使用itertools.izip_longest
和itertools.chain.from_iterable
:
>>> from itertools import izip_longest, chain
>>> x = ['abc', 'd', 'efgh']
>>> sentinel = object()
>>> [y for y in chain.from_iterable(izip_longest(*x, fillvalue=sentinel))
if y is not sentinel]
['a', 'd', 'e', 'b', 'f', 'c', 'g', 'h']
我會'y不是哨兵'...以防萬一'y'有一個時髦的定義'__ne__'。 (當然,這對絃樂無關緊要,但這是一個很好的習慣)。 – mgilson
@mgilson感謝您解決這個問題,實際上在我的真實代碼中使用了'not',但是在這裏使用了'!=',因爲我對此有點懷疑。 ;-) –
考慮你的觀衆:) – beroe