2017-03-06 57 views
0

我有一組刪除元組,對已經存在於另一元組

例:

{(2, 3, 7, 8), (1, 3), (4, 6), (4, 8), (1, 2, 3), (1, 6), (7, 8), (1, 6, 8), (3, 5)} 

但是,當一個元組,對已在其它元組我想刪除它。

例如: (7, 8)(2, 3, 7, 8)(1, 3)(1, 2, 3)(1, 6)(1, 6, 8)

所以集變爲:

{(2, 3, 7, 8), (4, 6), (4, 8), (1, 2, 3), (1, 6, 8), (3, 5)} 

中元素的元組中的順序並不重要你應該始終保持最長的順序。

你是怎麼做的?

+2

只有tuple- *對*,或元組數字任意數量的? –

+2

做的順序和位置很重要嗎?例如,「(8,7)」或「(2,8)」會被刪除嗎? –

+2

爲什麼'(1,3)'因爲有'(1,2,3)'而停留?訂單是否重要? –

回答

1

這不是一個非常有效的解決方案(O(n^2);遍歷集合兩次),但我不確定我們可以在這裏做得更好。

my_set = {(2, 3, 7, 8), (1, 3), (4, 6), (4, 8), (1, 2, 3), (1, 6), (7, 8), (1, 6, 8), (3, 5)} 

remove = set() 
for i in my_set: 
    for j in my_set: 
     if i != j and all(f not in remove for f in (i, j)): 
      if all(x in j for x in i): 
       remove.add(i) 

res = my_set - remove 
print(res) # {(2, 3, 7, 8), (4, 6), (4, 8), (1, 2, 3), (1, 6, 8), (3, 5)} 

注意,它內部的元組轉換爲集和穿上它(在元組重複元素)

1

我們可以通過轉換元組套更有效地做測試的一些限制,以及然後將這些集合轉換回元組。我使用frozensets是因爲它們是不可變的,就像元組一樣。

src = { 
    (2, 3, 7, 8), (1, 3), (4, 6), (4, 8), (1, 2, 3), 
    (1, 6), (7, 8), (1, 6, 8), (3, 5) 
} 

temp = [frozenset(u) for u in src] 
temp.sort(key=len, reverse=True) 

dest = [] 
for t in temp: 
    if not any(t <= u for u in dest): 
     dest.append(t) 

dest = {tuple(sorted(u)) for u in dest} 
print(dest) 

輸出

{(2, 3, 7, 8), (4, 6), (4, 8), (1, 2, 3), (1, 6, 8), (3, 5)} 

我們先元組轉換爲集並將其存儲在一個列表,按長度排序列表中的項目,從最長到最短。然後,我們將每個列表項添加到dest列表中,僅當它不是現有項目的子集時。然後我們使用集合理解將集合轉換回有序元組。

1

from pprint import pprint 

S = {(2, 3, 7, 8), (1, 3), (4, 6), (4, 8), (1, 2, 3), (1, 6), (7, 8), (1, 6, 8), (3, 5)} 

V = {frozenset(s) for s in S} 

W = {x for x in V if not any(x <= y for y in V - {x})} 

pprint(W) 

輸出

set([frozenset([4, 8]), 
    frozenset([3, 5]), 
    frozenset([2, 3, 7, 8]), 
    frozenset([4, 6]), 
    frozenset([1, 6, 8]), 
    frozenset([1, 2, 3])])