我有一个元组列表,我需要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中查找similair x,并创建匹配y的组合的新列表。
我发现了一些有关itertools,defaultdict,grouping等的有用帖子,但我没有在这里正确实现。到目前为止,我几乎已经使用了大量的for,if和while循环来解决它,但我确信有一种更好更多的pythonic方式。我非常感谢任何指点我正确方向的人!
答案 0 :(得分: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')]
答案 1 :(得分: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))