0

我有一个元组列表,我需要 1)根据第一个属性进行排序,然后 2)根据与第一个属性匹配的第二个属性的组合创建一个新的元组列表。

例如,这就是我想要做的:

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

所以基本上它在 x,y 中寻找相似的 x,并创建一个匹配 y 组合的新列表。

我发现了一些关于 itertools、defaultdict、grouping 等有用的帖子,但没有什么我可以在这里正确实现的。到目前为止,我几乎已经使用大量的 for、if 和 while 循环解决了这个问题,但我确信有一种更好、更 Pythonic 的方法。我真的很感激有人指出我正确的方向!

4

2 回答 2

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')]
于 2013-06-11T21:02:32.013 回答
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))
于 2013-06-11T21:17:29.877 回答