2016-04-19 7 views
1

Lets sagen, dass ich die folgenden Listen habe:Kombinationen zwischen den Werten von Listen

letters = ['a','b','c'] 
numbers = ['one','two'] 
others = ['here','there'] 

Und ich möchte alle möglichen compinations aller Werte. Ich mache folgendes:

from itertools import permutations 
b = [] 
b.extend(letters) 
b.extend(numbers) 
b.extend(others) 
result1 = list(permutations(b,2)) 

Die Ergebnisse sind in Ordnung. Aber was ich genauer wissen will, ist, die "Arten" von Compinations zu kennen. Zum Beispiel Ergebnis sollte sein:

('a','b','letters-letters') 

oder

('a','one','letters-numbers') 
('one','a','letters-numbers') 

ich den folgenden Code verwenden:

from itertools import product 
result2=[] 
result2.extend([x+('letter-letter',) for x in list(permutations(letters ,2))]) 
result2.extend([x+('number-number',) for x in list(permutations(numbers,2))]) 
result2.extend([x+('other-other',) for x in list(permutations(others,2))]) 
result2.extend([x+('number-letter',) for x in list(product(numbers,letters))]) 
result2.extend([x+('number-letter',) for x in list(product(letters,numbers))]) 
result2.extend([x+('number-others',) for x in list(product(numbers,others))]) 
result2.extend([x+('number-others',) for x in list(product(others,numbers))]) 
result2.extend([x+('letters-others',) for x in list(product(letters,others))])  
result2.extend([x+('letters-others',) for x in list(product(others,letters))]) 

Gibt es eine schnelle, elegante Art und Weise, dies zu tun?

Antwort

3

IIUC, der Schlüssel ist die Kopplung, zu welcher Datenreihe ein Element ein Element des Elements ist. Zum Beispiel:

from itertools import permutations 

data = {'letters': ['a','b','c'], 
     'numbers': ['one','two'], 
     'others': ['here','there']} 

poss = [(v,k) for k, vv in data.items() for v in vv] 
results = (list(zip(*p)) for p in permutations(poss, 2)) 
results = [p[0] + ('-'.join(p[1]),) for p in results] 

gibt mir

[('a', 'b', 'letters-letters'), 
('a', 'c', 'letters-letters'), 
('a', 'here', 'letters-others'), 
... 
('two', 'here', 'numbers-others'), 
('two', 'there', 'numbers-others'), 
('two', 'one', 'numbers-numbers')] 

, die funktioniert, weil wir mit einem poss suchen, wie

>>> poss[:3] 
[('a', 'letters'), ('b', 'letters'), ('c', 'letters')] 

und wählen Sie dann zwei Elemente aus ihm, mit dem Zip-Sterne beginnen zu mach jedes gewählte Paar zu etwas wie

>>> next(list(zip(*p)) for p in permutations(poss, 2)) 
[('a', 'b'), ('letters', 'letters')] 
Verwandte Themen