我有一個需要過濾的值的排序列表,以便返回的唯一值與其左側的值不同。Python:使用列表理解進行列表過濾
例如mylist = [1,2,2,3,3,3,3,6,7,9,9,11]會返回[1,2,3,6,7,9,11] 。
我已經完成了這個任務使用for和如果循環,但想知道是否沒有一個更優雅的解決方案,使用列表解析。
謝謝!
我有一個需要過濾的值的排序列表,以便返回的唯一值與其左側的值不同。Python:使用列表理解進行列表過濾
例如mylist = [1,2,2,3,3,3,3,6,7,9,9,11]會返回[1,2,3,6,7,9,11] 。
我已經完成了這個任務使用for和如果循環,但想知道是否沒有一個更優雅的解決方案,使用列表解析。
謝謝!
在排序的列表中,這與定義與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))
,如果您知道您的輸入列表將始終被排序,那麼這應該是首選。
我不認爲有一種方式與列表理解來做到這一點,但更好的方法來做到這一點是:
mylist=[1,2,2,3,3,3,3,6,7,9,9,11]
uniqueList = list(set(mylist))
這很有道理,它更簡單謝謝! – user2957824
你可以嘗試這樣的事情:
>>> m=set(mylist)
>>> m
set([1, 2, 3, 6, 7, 9, 11])
謝謝@roippi。你能解釋一下解決方案1背後的機制嗎?理解「and not seen.add(x)」如何過濾列表有點麻煩。 – user2957824
@ user2957824這是代碼golf-ish部分。 'set.add'不返回任何東西,所以這部分相當於'而不是None',它總是成立的。它還在'set'中增加了'x',所以第二次''in seen''是'True',它被過濾掉了。 – roippi