2012-03-03 12 views
6

Nie wiem, jak rozejrzeć się za to, ale od itertools funkcja izip_longest robi to:izip_longest z pętli zamiast fillvalue

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

Miałem nadzieję iterable biblioteka miałaby coś do to zrobić:

izip_longest_better('ABCDE', 'xy') ->Ax By Cx Dy Ex

Korzystnie dla dowolnej liczby iterables, będąc używane do generowania milionów kombinacji. Napiszę własną, ale pomyślałem, że zapytam, ponieważ jestem pewien, że moja własna nie będzie bardzo pytoniczna.

Awesome, To był cykl, którego nie próbowałem. Byłem też w stanie uzyskać coś działającego przez zagnieżdżanie dla pętli na tablicach zamiast iteratorów, ale jest to znacznie lepsze. Co ja w końcu wykorzystane zostało to obsłużyć podobny do iZIP”

EDIT: skończyło się

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 

Odpowiedz

13

coś takiego

>>> 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')] 

itd. I nie arbitralne-number-of -przykładowy wariant (zakładając, że nie chcesz, aby pierwszy argument był cyklowany i nie jesteś naprawdę zainteresowany 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

Awesome, To był cykl, którego nie próbowałem. Byłem też w stanie uzyskać coś działającego przez zagnieżdżanie dla pętli na tablicach zamiast iteratorów, ale jest to znacznie lepsze. To, co w końcu wykorzystałem, było podobne do obsługi izip. 'list = posortowane (args, klucz = len, reverse = True)' 'result = list (itertools.izip (* ([lists [0]] + [itertools.cycle (l) dla l na listach [ 1:]]))) ' – adzuci

+0

bardzo ważne przy generowaniu słownika z listy, która ma nagłówki w pierwszych elementach! – SIslam

1

dla Pythona 3 chcesz użyć zip_longest Jak izip_longest została zaniechana.

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