3 回答

TA貢獻2080條經驗 獲得超4個贊
要檢查兩個條件type(e)==int,并e not in l2使用and運營商
>>> l1 = [1,2,3,'4']
>>> l2 = [1,2]
>>>
>>> r = [e+e for e in l1 if type(e)==int and e not in l2]
>>>
>>> r
[6]

TA貢獻1836條經驗 獲得超5個贊
嘗試使用set:
l1 = [1,2,3,'4']
l2 = [1,2]
print([e+e for e in [x for x in l1 if not x in set(l1).intersection(l2)] if type(e) == int])
輸出:
[6]

TA貢獻1111條經驗 獲得超0個贊
如果這是一項真正的任務,并且您想解決這個問題,我強烈建議您使用集來擺脫不需要的元素,因為這將給您線性的時間復雜度,而不是二次的時間。
>>> l1 = [1, 2, 3, '4']
>>> l2 = [1, 2]
>>> s1 = set(l1)
>>> s2 = set(l2)
>>> result = [x * 2 for x in s1.intersection(s2)]
>>> result
[2, 4]
您原來的問題已經在評論和答案中得到了回答。
編輯:如果您對復雜性解釋感興趣:您在代碼中正在執行的操作,則需要查找l1in中的每個元素l2。假設l1有n元素,并且l2有m元素。要查找列表或數組中的某些內容,必須查看該列表中的每個元素,因此查找其中的元素會l2很O(m)復雜。你這樣做對的每一個元素l1,所以n倍。因此,構建該列表所需的總復雜度為的兩倍O(nm)。
但是,對于集合,每個查找都是O(1),因為從本質上講它是一個哈希表。你仍然需要遍歷你的l1,所以O(n),現在的查找固定的時間,所以O(1)。這樣一來,我們總共有O(n)。
如果您應該在列表中包含重復的元素,這會有些棘手,但是您仍然可以使用字典或Counters。
添加回答
舉報