2011-12-04 4 views
4

J'ai un grand groupe de listes dans les listes que je veux combiner: Il ressemble un peu comme ceci:Comment combiner chacun des éléments de deux listes en Python?

[[1,2,3,4,5], [6,7,8,9,0], [2,5,7,9,4], [4,7,8,43,6]...] 

jusqu'à environ 20 de ces listes dans une liste. Je veux maintenant combiner la première liste et la deuxième liste pour ressembler à ceci:

[[1,6], [2,7], [3,8], [4,9], [5,0]] 

Et je veux le faire à nouveau avec le 1er et 3e, tout le chemin jusqu'à la fin. Et recommencez en commençant par la deuxième liste à la 3ème, 4ème ... dernière ligne (mais pas la première parce que cela a déjà été fait avec la 1ère à la 2ème liste). Comment puis-je écrire du code qui va le faire?

Voici ce que j'ai jusqu'à présent:

xcols = la colonne avec toutes les listes comme je l'ai montré ci-dessus

def MakeLists(xcols): 
    multilist = [] 
    for i in xcols: 
     for j in xcols[index(i):]: 
      currentlist = map(list.__add__, i, j) 
      multilist.append(currentlist) 

me donne une erreur quand je le lance bien, probablement à la partie carte parce que je ne sais pas comment convertir d'abord chaque élément en une liste et ensuite les mapper. Toute aide est la bienvenue. Merci!

Répondre

4

Que diriez-vous quelque chose comme ceci:

>>> import itertools 
>>> foo = [[1, 2, 3], [4, 5, 6], [7, 8, 8]] 
>>> for p in itertools.permutations(foo, 2): 
...  print zip(*p) 
... 
[(1, 4), (2, 5), (3, 6)] 
[(1, 7), (2, 8), (3, 8)] 
[(4, 1), (5, 2), (6, 3)] 
[(4, 7), (5, 8), (6, 8)] 
[(7, 1), (8, 2), (8, 3)] 
[(7, 4), (8, 5), (8, 6)] 

Edit: Dans le cas où vous ne souhaitez que zip une liste avec ceux après, que les gens dans les commentaires expliquent:

>>> import itertools 
>>> for p in itertools.combinations(foo, 2): 
...  print zip(*p) 
... 
[(1, 4), (2, 5), (3, 6)] 
[(1, 7), (2, 8), (3, 8)] 
[(4, 7), (5, 8), (6, 8)] 
+0

Ce serait une très bonne solution, mais cela ne fonctionne pas de la façon dont OP veut que ça marche - c'est la deuxième liste avec le premier, etc. (mais il ne faut que 'zip' seulement avec les listes suivant la deuxième liste etc.). – Tadeck

+0

Je pense que OP doit avoir demandé des combinaisons, plutôt que des permutations: "(mais pas le premier parce que cela a déjà été fait avec la première à la deuxième liste)" –

+0

Merci, les gars. Je suppose que je n'ai pas bien compris ou prêté assez d'attention. J'ai mis à jour ma réponse. – stranac

2
a=[[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]] 

i=0 

for l in a[i:]: 
    for inner in a[i+1:]: 
     print [list(b) for b in zip(l, inner)] 
    i += 1 

impressions

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0]] 
[[1, 2], [2, 5], [3, 7], [4, 9], [5, 4]] 
[[1, 4], [2, 7], [3, 8], [4, 43], [5, 6]] 
[[6, 2], [7, 5], [8, 7], [9, 9], [0, 4]] 
[[6, 4], [7, 7], [8, 8], [9, 43], [0, 6]] 
[[2, 4], [5, 7], [7, 8], [9, 43], [4, 6]] 
+0

Généralement, vous ne voulez pas utiliser les boucles de style c en Python. Parfois nécessaire, mais c'est impopulaire. –

1
def foo(li): 
    for element in li[1:]: 
    for pair in zip(li[0], element): 
     yield pair 

>>> from test import foo 
>>> bar = [[1, 2, 3, 5, 6], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]] 
>>> foo(bar) 
<generator object foo at 0x10592df50> 
>>> [e for e in foo(bar)] 
[(1, 6), (2, 7), (3, 8), (5, 9), (6, 10), (1, 11), (2, 12), (3, 13), (5, 14), (6, 15)] 
1

Vous ne pourrez accomplir votre résultat escompté si vous avez un nombre pair de listes. Ce code produira le résultat souhaité. Il peut y avoir quelque chose de plus "pythonique", cependant.

foo = [[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]] 
newlist = [] 

for i in xrange(len(foo)): 
    if i % 2 == 0: 
     list1 = foo[i] 
     list2 = foo[i + 1] 
     for n in xrange(len(list1)): 
      newlist.append([list1[n],list2[n]]) 

print newlist 

Résultat:

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0], [2, 4], [5, 7], [7, 8], [9, 43], [4, 6]] 
1

La solution la plus courte est (lsts une liste des listes que vous avez):

[zip(lsts[i],lsts[j]) for i in xrange(len(lsts)) for j in xrange(i,len(lsts)) if i!=j] 

Il fera exactement ce que vous avez dit. Essayez ceci.

Est-ce ce que vous attendiez?

Questions connexes