0

1) 1 番目の属性に基づいて並べ替え、2) 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、グループ化などに関する役立つ投稿をいくつか見つけましたが、ここで正しく実装できるものはありません。これまでのところ、大量の for、if、while ループを使用してほぼ解決しましたが、より適切でより Pythonic な方法があると確信しています。誰かが私を正しい方向に向けてくれて本当に感謝しています!

4

2 に答える 2

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 に答える
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 に答える