2011-06-05 44 views
6

我想用Python中的數據做一些組合的東西。 我看了看這個問題How to generate all permutations of a list in Python,但覺得不適合我的需要.. 我有這種類型的數據...:Python組合w/o重複 - Pyncomb?

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

...和我需要三個要素的所有可能的組合每個組只有一個,沒有重複,每個組合都保存到列表中。

我知道在這種情況下有18種可能的不同組合(3 * 3 * 2 = 18),但不知道我怎麼寫這個代碼。 我已閱讀關於Pyncomb軟件包,但不知道在這種情況下適用的函數;也許有一個工作的功能。

希望有人可以幫助我...

在此先感謝;

PEIXE

回答

9

最簡單的方法是使用itertools.product()

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

打印

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

哦,是的! 我一直在用十分之一的代碼行嘗試,但這個解決方案真的很棒,很簡單。 :DD 非常感謝你,斯文! – peixe 2011-06-05 19:12:53

4

避免了進口是使用列表理解另一種選擇:

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

這給出了與Sven相同的結果,但如果您想要進行一些過濾,也很好。

+0

我也會嘗試這個解決方案。由於我必須以這種方式管理大量的數據,因此我最終選擇了最有效的數據。 ; D 謝謝,PAG! – peixe 2011-06-05 19:31:13

+1

這可能會更有效率,特別是如果您將這些方括號更改爲括號:對於((a,b,c)中的x ...):.... – PAG 2011-06-05 19:35:40

+0

這兩種方法之間最重要的區別是如果您事先不知道組數,也可以使用'itertools.product()',而這種方法對組數進行硬編碼。 – 2011-06-05 19:49:50