2013-06-11 94 views
0

我有一個元組列表,我需要1)基於第1個屬性進行排序,然後2)根據匹配的第2個屬性的組合創建一個新的元組列表第一屬性。Python中元組的排列/組合

例如,這就是我想要做的事:

list = [(a,b),(c,d),(a,z),(a,t,),(c,z)} 

# output should be: 
new_list=[(b,z),(b,t),(z,b),(d,z) #a list of permutations would also be fine 

所以基本上它看起來similair X的在X,Y,並創建匹配的y的組合的一個新的列表。

我發現了關於itertools,defaultdict,分組等的一些有用的帖子,但沒有什麼我可以在這裏正確實現。到目前爲止,我幾乎已經用了大量的for,while和while循環來解決它,但是我確信有更好更Python的方法。我真的很感謝任何人指出我正確的方向!

回答

1
from collections import defaultdict 
from itertools import permutations, combinations 

d = defaultdict(list) 
l = [('a', 'b'), ('c', 'd'), ('a', 'z'), ('a', 't'), ('c', 'z')] 

for k,v in l: 
    d[k].append(v) 

new_list = [] 

for k,v in d.iteritems(): 
    new_list.extend([x for x in combinations(v, 2)]) # could also use permutations here 

>>> new_list 
[('b', 'z'), ('b', 't'), ('z', 't'), ('d', 'z')] 
+0

我實現了這個和它的工作很大。謝謝,特別有用的是排列選項。這是一個網絡圖,所以重複會使線條變粗。 – cmacdona101

+0

你可以寫'list(combinations(v,2))'而不是'[x for x in ...]' – Lynn

1
def tuple_combs(lst): 
    groups = itertools.groupby(sorted(lst), lambda (x, y): x) 
    combs = (itertools.combinations((y for (x, y) in v), 2) for k, v in groups) 
    return list(itertools.chain.from_iterable(combs)) 
+0

非常感謝你的快速響應。我實施了其他迴應(迄今爲止我對Lambda的經驗有限),但我非常感謝您的幫助! – cmacdona101