2012-03-03 5 views
6

Je ne sais pas comment regarder autour de cela, mais de itertools la fonction izip_longest fait ceci:izip_longest avec boucle au lieu de fillvalue

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

J'espérais une bibliothèque itérables aurait quelque chose à faire:

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

de préférence pour un nombre arbitraire de iterables, étant utilisé pour générer des millions de combinaisons. J'écrirai le mien, mais j'ai pensé que je le demanderais, puisque je suis sûr que le mien ne sera pas très pythonique.

Impressionnant, C'était le cycle que je n'avais pas essayé. J'ai également réussi à faire fonctionner quelque chose en imbriquant des boucles sur des tableaux au lieu des itérateurs, mais c'est beaucoup mieux. Ce que je finalement utilisé était pour gérer aussi semblable à Izip »

EDIT: Nous avons fini avec

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 

Répondre

13

Quelque chose comme ça

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

etc. Et il y a le nombre arbitraire, de variante -iterables (en supposant que vous ne voulez pas que le premier argument passe en cycle, et que vous ne soyez pas vraiment intéressé par 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

Génial, C'était le cycle que je n'avais pas essayé. J'ai également réussi à faire fonctionner quelque chose en imbriquant des boucles sur des tableaux au lieu des itérateurs, mais c'est beaucoup mieux. Ce que j'ai finalement utilisé était ceci pour manipuler semblable à izip. 'lists = trié (args, key = len, reverse = Vrai)' 'result = liste (itertools.izip (* ([listes [0]] + [itertools.cycle (l) pour l dans les listes [ 1:]]))) ' – adzuci

+0

très important lors de la génération de dictionnaire à partir d'une liste qui ont des en-têtes dans les premiers éléments! – SIslam

1

Pour Python 3, vous souhaitez utiliser zip_longest Comme izip_longest a été déprécié.

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