2017-07-10 146 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')] 

我希望在元組的第一個元素的另一個元組的第二元素相匹配,並在同一時間,該元組的第二元件相同的其他元組的第一元素相匹配,以除去元組。 OutputList將如下所示;

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

是否有更簡單的方法來做到這一點,除了通過所有元組迭代進行比較,並保存到元組的一個新的列表?

謝謝。

回答

3

做兩套:第一套具有原始元組,第二套具有元素交換的元組。然後取兩組的交點。這些是要刪除的元組。讓所有的元組,但這些新名單:

>>> 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),而搜索列表會爲O(n ** 2)。

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

使用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] 
相關問題