2016-12-04 12 views
0

Ich ging einige Fragen über die Kombination von zwei Listen mit itertools, aber ich konnte keine finden, die mein Problem löst. Also, wäre es möglich mit itertools (oder einem anderen Modul) in Python zu arbeiten? Ich habe zwei Liste:Kombination von zwei Listen in Python

list1 = ['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
list2 = ['E.', 'A.', 'W.', 'C.'] 

Nun, ich Suche nach einer Lösung kombinieren sie wie das Ergebnis wie folgt aussieht (zB als eine Liste der Liste):

['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
['E.', 'Anne', 'Wells', 'Cannon'] 
['Elizabeth', 'A.', 'Wells', 'Cannon'] 
['Elizabeth', 'Anne', 'W.', 'Cannon'] 
['Elizabeth', 'Anne', 'Wells', 'C.'] 
['E.', 'A.', 'Wells', 'Cannon'] 
['E.', 'Anne', 'W.', 'Cannon'] 
... 
['E.', 'A.', 'W.', 'C.'] 
+1

Was haben Sie bisher versucht, zeigen Sie einige der Codes, die Sie versucht haben, das Problem zu lösen? – aBiologist

Antwort

0

produzieren länger Kombinationen von Indizes, dann diejenigen verwenden, um Namen mit Initialen zu ersetzen:

from itertools import combinations 

def replacements(names, initials): 
    for count in range(len(names)): 
     for positions in combinations(range(len(names)), count): 
      yield [initials[i] if i in positions else name for i, name in enumerate(names)] 
    yield initials 

So die obige erste ersetzt nicht anyt Hängt (length = 0), ersetzt dann eine Element (length = 1, outputing [0], dann [1], etc.), die ganzen Weg bis zu 3 Ersetzungen ([0, 1, 2], [0, 1, 3], etc.). Schließlich geben wir initials als den "4 Ersatz" -Fall aus.

Demo:

>>> names = ['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
>>> initials = ['E.', 'A.', 'W.', 'C.'] 
>>> for result in replacements(names, initials): 
...  print(result) 
... 
['Elizabeth', 'Anne', 'Wells', 'Cannon'] 
['E.', 'Anne', 'Wells', 'Cannon'] 
['Elizabeth', 'A.', 'Wells', 'Cannon'] 
['Elizabeth', 'Anne', 'W.', 'Cannon'] 
['Elizabeth', 'Anne', 'Wells', 'C.'] 
['E.', 'A.', 'Wells', 'Cannon'] 
['E.', 'Anne', 'W.', 'Cannon'] 
['E.', 'Anne', 'Wells', 'C.'] 
['Elizabeth', 'A.', 'W.', 'Cannon'] 
['Elizabeth', 'A.', 'Wells', 'C.'] 
['Elizabeth', 'Anne', 'W.', 'C.'] 
['E.', 'A.', 'W.', 'Cannon'] 
['E.', 'A.', 'Wells', 'C.'] 
['E.', 'Anne', 'W.', 'C.'] 
['Elizabeth', 'A.', 'W.', 'C.'] 
['E.', 'A.', 'W.', 'C.'] 

Natürlich stattdessen eine spezielle initials Liste verwenden, können Sie nur name[0] + '.' jedes Mal verwenden, um nur die anfängliche zu erzeugen.

+0

Vielen Dank, das funktioniert ganz gut! –