2014-04-14 11 views
19

Wir haben zwei Listen A und B:Wie erhalten Sie alle Zuordnungen zwischen zwei Listen?

A = ['a','b','c'] 
B = [1, 2] 

Gibt es einen pythonic Weg, um die Menge aller Karten zwischen A und B 2^enthält, zu bauen n (hier 2^3 = 8)? Das heißt:

[(a,1), (b,1), (c,1)] 
[(a,1), (b,1), (c,2)] 
[(a,1), (b,2), (c,1)] 
[(a,1), (b,2), (c,2)] 
[(a,2), (b,1), (c,1)] 
[(a,2), (b,1), (c,2)] 
[(a,2), (b,2), (c,1)] 
[(a,2), (b,2), (c,2)] 

itertools.product benutzen, ist es möglich, alle Tupel zu erhalten:

import itertools as it 
P = it.product(A, B) 
[p for p in P] 

Welche gibt:

Out[3]: [('a', 1), ('a', 2), ('b', 1), ('b', 2), ('c', 1), ('c', 2)] 

Antwort

23

Sie können dies tun, mit itertools.product und zip

from itertools import product 
print [zip(A, item) for item in product(B, repeat=len(A))] 

Ausgabe

[[('a', 1), ('b', 1), ('c', 1)], 
[('a', 1), ('b', 1), ('c', 2)], 
[('a', 1), ('b', 2), ('c', 1)], 
[('a', 1), ('b', 2), ('c', 2)], 
[('a', 2), ('b', 1), ('c', 1)], 
[('a', 2), ('b', 1), ('c', 2)], 
[('a', 2), ('b', 2), ('c', 1)], 
[('a', 2), ('b', 2), ('c', 2)]] 

product(B, repeat=len(A)) produziert

[(1, 1, 1), 
(1, 1, 2), 
(1, 2, 1), 
(1, 2, 2), 
(2, 1, 1), 
(2, 1, 2), 
(2, 2, 1), 
(2, 2, 2)] 

Dann wir jedes Element aus dem Produkt auswählen und zip es mit A, die gewünschte Ausgabe zu erhalten.

11
import itertools as it 

A = ['a','b','c'] 
B = [1, 2] 

for i in it.product(*([B]*len(A))): 
    print(list(zip(A, i))) 

Ausgänge:

[('a', 1), ('b', 1), ('c', 1)] 
[('a', 1), ('b', 1), ('c', 2)] 
[('a', 1), ('b', 2), ('c', 1)] 
[('a', 1), ('b', 2), ('c', 2)] 
[('a', 2), ('b', 1), ('c', 1)] 
[('a', 2), ('b', 1), ('c', 2)] 
[('a', 2), ('b', 2), ('c', 1)] 
[('a', 2), ('b', 2), ('c', 2)] 

Nicht sicher, ob es sehr pythonic ist, ist es, wenn man sich it.product(*([B]*len(A))) aussehen, weil es mehrere Python-spezifische Sprachfunktionen verwendet. Aber es ist eigentlich zu kryptisch, um Python zu sein ... B wird n-mal basierend auf der Länge von A wiederholt und in die Produktfunktion ausgepackt.

Verwandte Themen