0

タプルのリストがあります:

lst = [('a','b'), ('c', 'b'), ('a', 'd'), ('e','f'), ('a', 'b')]

次の出力リストが必要です。

output = [('a','b'), ('e','f')]

つまり、最初のタプルの要素を残りのタプルと比較し、1つ以上の重複要素を含むタプルを削除したいと思います。

私の試み:

forループを使用することを考えていましたが、リストが非常に大きくなると、それは実現可能ではありません。私は次の投稿を閲覧しましたが、正しい解決策を得ることができませんでした:

タプルのリストから重複するメンバーを 削除する順序を維持しながら、リストから重複するメンバーをどのように削除しますか?

誰かが私を正しい方向に導くことができれば、それは非常に役に立ちます。ありがとう!

4

2 に答える 2

6

最初の要素だけでなく、すべての要素の「重複」を抑制したい場合は、次のように使用できます。

lst = [('a','b'), ('c', 'b'), ('a', 'd'), ('e','f'), ('a', 'b')]

def merge(x):
    s = set()
    for i in x:
        if not s.intersection(i):
            yield i
            s.update(i)

与える

>>> list(merge(lst))
[('a', 'b'), ('e', 'f')]
>>> list(merge([('a', 'b'), ('c', 'd'), ('c', 'e')]))
[('a', 'b'), ('c', 'd')]
>>> list(merge([('a', 'b'), ('a', 'c'), ('c', 'd')]))
[('a', 'b'), ('c', 'd')]
于 2013-02-05T00:26:13.240 に答える
4

セットが役立つはずです:

>>> s = map(set, lst)
>>> first = s[0]
>>> [first] + [i for i in s if not i & first]
[set(['a', 'b']), set(['e', 'f'])]

またはifilterfalse

>>> from itertools import ifilterfalse
>>> s = map(set, lst)
>>> [first] + list(ifilterfalse(first.intersection, s))
[set(['a', 'b']), set(['e', 'f'])]
于 2013-02-05T00:25:48.330 に答える