2017-07-10 12 views
1

私はこのようなタプルのリストを持っています。タプルのリストからタプルを削除する

ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'), ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')] 

Iはタプルの最初の要素が別の組の第2の要素と一致すると同時に、タプルの2番目の要素は同一の他のタプルの最初の要素と一致する場合、タプルを削除します。 OutputListは次のようになります。

OutputList = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')] 

比較するために、すべてのタプルを反復処理し、タプルの新しいリストに保存する以外にこれを行うための簡単な方法はありますか?

ありがとうございます。

答えて

3

2つのセットを作成します。最初のタプルは元のタプルを持ち、2番目のタプルは交換されたタプルを持ちます。次に、2つのセットの交点を取る。これらは削除するタプルです。タプルの全てが、それらを使用して新しいリストを作成します。リストを検索すると、Oも(N ** 2)になるのに対し、

>>> ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'), ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')] 
>>> set1 = set(ListTuples) 
>>> set2 = set((e2, e1) for e1, e2 in ListTuples) 
>>> to_remove = set1 & set2 
>>> to_remove 
set([('192.168.1.103', '192.168.1.100'), ('192.168.1.100', '192.168.1.103')]) 
>>> NewList = [t for t in ListTuples if t not in to_remove] 
>>> NewList 
[('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')] 

これは、O(n)となります。

1

さて、あなたはお互いにそれらを比較したい場合は、あなたのタプルを反復処理する必要がありますが、少なくともあなたがより速く検索のための逆要素と一時的なセットを使用することができます。

ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'), 
       ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')] 

seen = set() 
for element in ListTuples: 
    if element in seen: 
     seen.discard(element) 
    else: 
     seen.add(tuple(reversed(element))) 
OutputList = [tuple(reversed(element)) for element in seen] 

print(OutputList) # [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')] 

それは維持しません。注文、tho。

1

各ソートタプルが発生した回数をカウントして、1より大きい数持っているそれらのタプルフィルタリングするcollections.Counterを使用します。これは内の項目の順序を保持しないこと

from collections import Counter 

ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'), ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')] 

counts = Counter(tuple(sorted(t)) for t in ListTuples) 
OutputList = [k for k in counts if counts[k] == 1] 

>>> OutputList 
[('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')] 

は注意を元のリスト。この場合、それがあなたにとって重要かどうかはわかりません。

また、各タプルを並べ替えると少し非効率ですが、項目の順序を考慮する必要があります。一般的なケースではタプルごとに2つ以上の要素がある場合は、タプルを並べ替えます行く道がある。

OutputList = [k for k, count in Counter(tuple(sorted(t)) for t in ListTuples).items() if count == 1] 

あなたはそれをこのようなワンライナーを作ることができます

関連する問題