2014-04-14 13 views
19
Biz iki listeleri, A ve B sahip

:İki liste arasındaki tüm eşleştirmeler nasıl alınır?

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

A ve^n 2 içeren B arasındaki tüm haritaların kümesi oluşturmak için pythonic yolu var mı (burada 2^3 = 8)? Yani:

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

verir: itertools.product kullanma

[(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)] 

, tüm dizilerini elde etmek mümkündür

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

cevap

23

Sen itertools.product ve zip

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

Çıktı

[[('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))

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

Sonra üründen her bir öğeyi seçmek ve istediğiniz çıktıyı almak için, A ile zip üretir.

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

çıkışlar:

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

buna çoklu piton özgü dil özelliklerini kullandığından, it.product(*([B]*len(A))) bakarsanız öyle, çok pythonic ise emin değilim. Ama aslında pythonic olmak için çok şifreli ... B, A uzunluğuna göre n-kez tekrarlandı ve ürün fonksiyonuna açıldı.