2011-06-05 11 views
6

Python'da veri içeren bazı birleştirici şeyler yapmaya çalışıyorum. Sorumu How to generate all permutations of a list in Python görünüyordu, ama bu benim ihtiyaçlarını uymuyor düşünüyorum .. Ben bu tip verilere sahip ...:Python combinatorials w/o tekrarı - Pyncomb?

group1-Steve 
    group1-Mark 
    group1-Tom 
    group2-Brett 
    group2-Mick 
    group2-Foo 
    group3-Dan 
    group3-Phil 

... ve ben üç unsurdan tüm olası kombinasyonları yapmak gerekir Her gruptan sadece biriyle, tekrar olmadan, her kombinasyonda bir listeye kaydedilir.

Bu durumda, mümkün olan 18 farklı kombinasyon var (3 * 3 * 2 = 18), ama bu kodu nasıl yazabilirim bilmiyorum. Pyncomb paketi hakkında okudum, ancak bu durumda uygulanacak işlevi bilmiyorum; belki de işi yapan bir fonksiyon var. Herkes bana yardımcı olabilir

Umut ... önceden

teşekkürler;

Peixe

cevap

9

kolay yolu itertools.product() kullanmaktır:

group1 = ["Steve", "Mark", "Tom"] 
group2 = ["Brett", "Mick", "Foo"] 
group3 = ["Dan", "Phil"] 
for x in itertools.product(group1, group2, group3): 
    print x 

baskılar

('Steve', 'Brett', 'Dan') 
('Steve', 'Brett', 'Phil') 
('Steve', 'Mick', 'Dan') 
('Steve', 'Mick', 'Phil') 
('Steve', 'Foo', 'Dan') 
('Steve', 'Foo', 'Phil') 
('Mark', 'Brett', 'Dan') 
('Mark', 'Brett', 'Phil') 
('Mark', 'Mick', 'Dan') 
('Mark', 'Mick', 'Phil') 
('Mark', 'Foo', 'Dan') 
('Mark', 'Foo', 'Phil') 
('Tom', 'Brett', 'Dan') 
('Tom', 'Brett', 'Phil') 
('Tom', 'Mick', 'Dan') 
('Tom', 'Mick', 'Phil') 
('Tom', 'Foo', 'Dan') 
('Tom', 'Foo', 'Phil') 
+0

Oh yes !! Kod satırlarının onda birini deniyorum, ancak bu çözüm gerçekten şaşırtıcı ve basit. : DD Çok teşekkür ederim Sven! – peixe

4

ithalat bir liste anlama kullanmaktır önler diğer alternatif:

[(a, b, c) for a in group1 for b in group2 for c in group3] 

Bu, Sven ile aynı sonucu verir, ancak biraz filtreleme yapmak isterseniz de iyidir.

+0

Bu çözüme de bir çözüm sunacağım. Bu şekilde düzenlenmiş oldukça büyük miktarda veriyi yönetmek zorunda olduğum için, sonunda en verimli olanı seçiyorum. D Teşekkürler, PAG! – peixe

+1

Özellikle bu köşeli parantezleri paranteze değiştirdiğinizde daha verimli olabilir: x için ((a, b, c) için bir ....): .... – PAG

+0

İki yaklaşım arasındaki en önemli fark, itertools.product() 'ın da önceden grup sayısını bilmediğinizde kullanılabileceği, bu yaklaşımın ise grup sayısını kodlayabildiği. –

İlgili konular