2013-10-23 71 views
0

我的元組(Name, val 1, val 2, Class)Python的組合沒有重複的約束

tuple = (("Jackson",10,12,"A"), 
     ("Ryan",10,20,"A"), 
     ("Michael",10,12,"B"), 
     ("Andrew",10,20,"B"), 
     ("McKensie",10,12,"C"), 
     ("Alex",10,20,"D")) 

我需要返回使用itertools combinations不復讀班的所有組合的元組。我怎樣才能返回不重複類的組合。例如,第一個返回的語句將是:tuple0, tuple2, tuple4, tuple5依此類推。

+0

所有長度4的組合?或者任何長度? – wim

+0

任何長度的組合,只是沒有重複的類。 – user2758113

+2

p.s.調用元組'tuple'並不聰明 – wim

回答

5

製作的基團(由類):

>>> ts = (("Jackson",10,12,"A"), 
...  ("Ryan",10,20,"A"), 
...  ("Michael",10,12,"B"), 
...  ("Andrew",10,20,"B"), 
...  ("McKensie",10,12,"C"), 
...  ("Alex",10,20,"D")) 
>>> import itertools 
>>> import operator 
>>> 
>>> by_class = operator.itemgetter(3) 
>>> 
>>> tuple_grps = [list(grp) for key, grp in itertools.groupby(sorted(ts, key=by_class), key=by_class)] 
>>> tuple_grps 
[[('Jackson', 10, 12, 'A'), ('Ryan', 10, 20, 'A')], 
[('Michael', 10, 12, 'B'), ('Andrew', 10, 20, 'B')], 
[('McKensie', 10, 12, 'C')], 
[('Alex', 10, 20, 'D')]] 

然後,使用itertools.product以獲得所期望的結果:

>>> for xs in itertools.product(*tuple_grps): 
...  print(xs) 
... 
(('Jackson', 10, 12, 'A'), ('Michael', 10, 12, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D')) 
(('Jackson', 10, 12, 'A'), ('Andrew', 10, 20, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D')) 
(('Ryan', 10, 20, 'A'), ('Michael', 10, 12, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D')) 
(('Ryan', 10, 20, 'A'), ('Andrew', 10, 20, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D')) 

要獲得的組合的任何長度:

>>> for i in range(1, len(tuple_grps)+1): 
...  for xs in itertools.combinations(tuple_grps, i): 
...   for ys in itertools.product(*xs): 
...    print(ys) 
... 
(('Jackson', 10, 12, 'A'),) 
(('Ryan', 10, 20, 'A'),) 
(('Michael', 10, 12, 'B'),) 
(('Andrew', 10, 20, 'B'),) 
(('McKensie', 10, 12, 'C'),) 
(('Alex', 10, 20, 'D'),) 
(('Jackson', 10, 12, 'A'), ('Michael', 10, 12, 'B')) 
(('Jackson', 10, 12, 'A'), ('Andrew', 10, 20, 'B')) 
(('Ryan', 10, 20, 'A'), ('Michael', 10, 12, 'B')) 
(('Ryan', 10, 20, 'A'), ('Andrew', 10, 20, 'B')) 
... 
(('Ryan', 10, 20, 'A'), ('Andrew', 10, 20, 'B'), ('McKensie', 10, 12, 'C'), ('Alex', 10, 20, 'D')) 
+0

有沒有一種方法可以打印特定數量的元組,而不是所有的東西直到max? – user2758113

+0

沒關係想出來'我在範圍內(numberYouWant,len(tuple_grps)+1):' – user2758113

+0

@ user2758113,使用'itertools.islice'。參見[this](http://ideone.com/lJ53si)。 – falsetru