亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用列表理解:對不是字符串或另一個列表的元素的列表元素進行計算

使用列表理解:對不是字符串或另一個列表的元素的列表元素進行計算

一只斗牛犬 2021-04-02 18:10:28
我有兩個列表l1和l2,它們具有不同類型的元素,如下所示:l1 = [1,2,3,'4']l2 = [1,2]我想對l1中不在l2中且不是string類型的每個元素進行計算。所以我想知道是否有可能以某種方式隔離列表理解中的整數和字符串。首先,下面是一個示例,其中如果e不位于l2中,則將l1中的每個元素e添加到自身:# coder = [e+e for e in l1 if e not in l2]print(r)# result# [6, '44']由于它是字符,因此這里重復“ 4”,而不添加,但我想忽略該元素。所以我在想我可以隔離類型為(e)== int的元素。天真的嘗試:# coder = [e+e for e in l1 if type(e)==int not in l2]# output[2, 4, 6]在這里,l1中的'4'似乎被忽略了,因為它不是整數,但是即使不是l2中的3也被加到了自身上。這是怎么回事(除了我不理解列表理解之外的事實)?
查看完整描述

3 回答

?
犯罪嫌疑人X

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]


查看完整回答
反對 回復 2021-04-13
?
一只甜甜圈

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]


查看完整回答
反對 回復 2021-04-13
?
catspeake

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。


查看完整回答
反對 回復 2021-04-13
  • 3 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號