2012-03-03 47 views
6

不知道如何到處尋找這一點,但是從itertools功能izip_longest做到這一點:izip_longest與循環,而不是fillvalue

izip_longest('ABCD', 'xy', fillvalue='-') - >Ax By C- D-

我希望可迭代庫將有東西用於iterables任意數量>Ax By Cx Dy Ex

優選地,是 -

izip_longest_better('ABCDE', 'xy'):要這樣做用於生成數百萬個組合。我會寫我自己的,但我想我會問,因爲我確信我自己不會很pythonic。

太棒了,這是我沒有嘗試過的循環。我也能夠通過在數組上嵌套循環而不是迭代器來獲得某些工作,但這更好。我終於用了這個處理類似izip」

編輯: 與

def izip_longest_repeat(*args): 
    if args: 
     lists = sorted(args, key=len, reverse=True) 
     result = list(itertools.izip(*([lists[0]] + [itertools.cycle(l) for l in lists[1:]]))) 
    else: 
     result = [()] 
    return result 

回答

13

像這樣的東西端了

>>> import itertools 
>>> 
>>> a = 'ABCDE' 
>>> b = 'xy' 
>>> 
>>> list(itertools.izip_longest(a, b, fillvalue='-')) 
[('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-'), ('E', '-')] 
>>> list(itertools.izip(a, itertools.cycle(b))) 
[('A', 'x'), ('B', 'y'), ('C', 'x'), ('D', 'y'), ('E', 'x')] 

等還有的任意用戶號碼的-iterables變體(假設你不想讓第一個參數循環,並且你對itertools.product不感興趣):

>>> a = 'ABCDE' 
>>> bs = ['xy', (1,2,3), ['apple']] 
>>> it = itertools.izip(*([a] + [itertools.cycle(b) for b in bs])) 
>>> list(it) 
[('A', 'x', 1, 'apple'), ('B', 'y', 2, 'apple'), ('C', 'x', 3, 'apple'), 
('D', 'y', 1, 'apple'), ('E', 'x', 2, 'apple')] 
+0

太棒了,這是我沒有嘗試過的循環。我也能夠通過在數組上嵌套循環而不是迭代器來獲得某些工作,但這更好。我最終使用的是這個處理類似於izip。 (列表[list] [0])列表中的列表[ 1:]])))' – adzuci 2012-03-05 20:19:49

+0

非常重要,同時從列表中生成字典,在第一些元素中有標題! – SIslam 2016-02-06 11:36:06

1

對於Python 3,您要使用zip_longest 由於izip_longest已被棄用。

import itertools 
list = list(itertools.zip_longest('ABCD', 'xy', fillvalue='-')) 
print(list) // --> Ax By C- D-