[英]How do I not get duplicates in this list comprehension?
我試圖獲取兩個長度不同的列表,並嘗試使用列表推導來制作第三個包含相同數字的列表。 我想避免重復。
我試圖將列表理解與if測試一起使用,如代碼所示。 我也嘗試使用and語句,但這不起作用。
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
c = [x for x in a if x in b]
這是我目前擁有的解決方案,“我還嘗試將c列表理解更改為:
c = [x for x in a if x in b and x not in c]
但這沒有用。 使用列表推導不可能嗎? 我知道我可以很容易地使用集合來做到這一點。 我只是在練習使用列表理解。
根據對c使用列表的原因,可以考慮使用內置的set
結構進行交點操作,這樣可以保證元素的唯一性。 例如, set(a)
將產生含有獨特的元件的一組a
。
c = [x for x in a if x in b]
不起作用,因為在重復元素a
都仍包含在b
,因此不會被你的if語句排除。 ( 1
在a
中重復,但是兩個元素都將由您的第一個定義包含在c
,因為1
在b
)。
編輯:如果您只想修改列表理解但繼續使用它,則可以執行以下操作: c = [x for x in set(a) if x in b]
如果您想要一個包含在兩個原始列表中的任何一個中的所有元素的新列表,則可以使用set
類來實現。 也許是這樣的:
>>> a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
>>> list(sorted(set(a) | set(b)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 21, 34, 55, 89]
這樣做是從列表建設2台,然后找到該工會的所有元素,然后將結果轉換回列表。
這種方法比檢查大型列表elem for elem in a if elem in b
更快,因為對於集合而言,成員資格測試為O(1)
,但對於列表而言,最高為O(n)
。
我將提出一個略有不同的解決方案:這個想法是首先使用Counter
計數數字的頻率,然后使用鍵執行列表理解。 由於Counter
返回字典,因此不會有重復的鍵。
from collections import Counter
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
f1 = Counter(a)
f2 = Counter(b)
c = [x for x in f1.keys() if x in f2.keys()]
# [1, 2, 3, 5, 8, 13]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.