2012-06-08 39 views
0

我試圖找到關係中的重複項,並從列表中省略它們。我試過嵌套的if語句,但我還沒有得到正確的解決方案。比較嵌套在列表中的類似項目,並將它們刪除

list = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0] ] 
在下面的列表

,我想刪除「雙打」,和值,其中最後一項爲0。我想這樣的事情結束了:

newlist = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2] ] 

以何種方式能我將[u'polySurface5.e [4]',u'polySurface5.e [1]',.5]與[u'polySurface5.e [1]',u'polySurface5.e [4]',.5 ]並在第一個之後刪除任何事件?

非常感謝!

回答

2
my_list = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0] ] 

new_list = [] 
my_set = set() 
for sublist in my_list: 
    if sublist[2] != 0: 
     frozen_sub = frozenset(sublist) 
     if not frozen_sub in my_set: 
      new_list.append(sublist) 
      my_set.add(frozen_sub) 

結果:

>>> new_list 
[[u'polySurface5.e[4]', u'polySurface5.e[1]', 0.5], [u'polySurface5.e[8]', u'polySurface5.e[2]', 0.9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2]] 

注意list,我改變了原來的列表的名稱my_list。我這樣做是因爲list是Python中的一個關鍵字,但是通過調用objectlist,你正在遮蔽它。看看這個:

>>> list((1,2,3)) 
[1, 2, 3] 
>>> list = [3,4,5] 
>>> list((6,7,8)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'list' object is not callable 

編輯:回答後續的帖子。

set是一個數據結構,其中只包含唯一項目,而項目沒有順序。例如:

>>> set([1,2,2,4,4]) 
set([1, 2, 4]) 
>>> set([1,2,4]) == set([4,4,4,1,2]) 
True 

frozenset類似於設置的數據結構,但它是不同的。 set是可變的,而frozenset不可以;那是我們可以添加的東西來設置,但不是frozenset。但是,frozenset是可散列的,而set不是。那就是fozenset可以是「詞典」或集合中元素的關鍵字。

可變性:

​​

Hashability:

>>> b = set([1,2]) 
>>> d = set([5,3]) 
>>> g = set([b,d]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'set' 
>>> b = frozenset([1,2]) 
>>> d = frozenset([5,3]) 
>>> g = set([b,d]) 
>>> g 
set([frozenset([1, 2]), frozenset([3, 5])]) 

我希望這有助於。

+0

謝謝!正如我所需要的那樣工作。我試圖按照邏輯 我瞭解子列表,刪除值爲0,然後測試成員資格。什麼是my_set的功能? – dimitarsp

+0

+1不錯。非常好的解釋。 – mhawke

0
l = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], [u'polySurface5.e[2]', u'polySurface5.e[2]', 0]] 
# remove [...,0] 
l = filter(lambda i: i[-1] != 0, l) 
# sort keys (1st and 2nd field) 
l = [sorted(i[:-1]) + i[-1:] for i in l] 
# uniques 
add_if_unique = lambda res, x: (res + [x]) if x not in res else res 
l = reduce(add_if_unique, l, []) 
+0

這不會產生所需的結果。 – mhawke

+0

@mhawke,我忘了排序鍵。固定。 – astynax

0

這個單線劃線怎麼樣?

l = [[u'polySurface5.e[4]', u'polySurface5.e[1]', .5], 
    [u'polySurface5.e[8]', u'polySurface5.e[2]', .9], 
    [u'polySurface5.e[1]', u'polySurface5.e[4]', .5], 
    [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2], 
    [u'polySurface5.e[2]', u'polySurface5.e[2]', 0]] 

newlist = [list(member) for member in set([tuple(sorted(x[:-1]) + x[-1:]) for x in l if x[-1] != 0])] 

print newlist 
[[u'polySurface5.e[1]', u'polySurface5.e[4]', 0.5], [u'polySurface5.e[2]', u'polySurface5.e[8]', 0.9], [u'polySurface5.e[2]', u'polySurface5.e[9]', 1.2]]