2013-06-11 133 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