2014-01-11 36 views
0

我有一個需要過濾的值的排序列表,以便返回的唯一值與其左側的值不同。Python:使用列表理解進行列表過濾

例如mylist = [1,2,2,3,3,3,3,6,7,9,9,11]會返回[1,2,3,6,7,9,11] 。

我已經完成了這個任務使用for和如果循環,但想知道是否沒有一個更優雅的解決方案,使用列表解析。

謝謝!

回答

0

排序的列表中,這與定義與list(set(mylist))相同的定義與列表相同。

但是,碼打高爾夫球了一下,既然你問了一個名單,補償,還有迷人的:

seen = set() 

[x for x in mylist if x not in seen and not seen.add(x)] 
Out[3]: [1, 2, 3, 6, 7, 9, 11] 

或者:

from itertools import zip_longest 

[tup[0] for tup in zip_longest(mylist,mylist[1:]) if len(set(tup)) == 2] 
Out[11]: [1, 2, 3, 6, 7, 9, 11] 

其中與非你要求的工作後分類列表以及。

正如您所看到的,這兩種方法的可讀性都不如list(set(mylist)),如果您知道您的輸入列表將始終被排序,那麼這應該是首選。

+0

謝謝@roippi。你能解釋一下解決方案1背後的機制嗎?理解「and not seen.add(x)」如何過濾列表有點麻煩。 – user2957824

+0

@ user2957824這是代碼golf-ish部分。 'set.add'不返回任何東西,所以這部分相當於'而不是None',它總是成立的。它還在'set'中增加了'x',所以第二次''in seen''是'True',它被過濾掉了。 – roippi

3

我不認爲有一種方式與列表理解來做到這一點,但更好的方法來做到這一點是:

mylist=[1,2,2,3,3,3,3,6,7,9,9,11] 
uniqueList = list(set(mylist)) 
+0

這很有道理,它更簡單謝謝! – user2957824

1

你可以嘗試這樣的事情:

>>> m=set(mylist) 
>>> m 
set([1, 2, 3, 6, 7, 9, 11])