我有兩個串列,我想從第一個串列中洗掉一些專案。我不明白為什么我的代碼不起作用。我的輸入:
l0=['Localisation level 2 AM', 'Rang', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3', 'Unnamed: 5', 'Unnamed: 6']
l1=['Localisation level 2 AM', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3']
我嘗試這樣做,但“WP Level 2”仍在第一個串列 l0 中:
for e in l0:
if e in l1:
l0.remove(e)
print(l0)
['Rang', 'WP Level 2', 'Unnamed: 5', 'Unnamed: 6']
uj5u.com熱心網友回復:
為了您的資訊,如果訂單無關緊要,您可以使用set來完成您想要的:
>>> set(l0).difference(l1)
{'Rang', 'Unnamed: 5', 'Unnamed: 6'}
uj5u.com熱心網友回復:
正如其他人所說,在迭代串列時修改串列是一個壞主意。
處理這個問題的pythonic方法是構造一個新串列并將其分配回l0:
l0 = [item for item in l0 if not item in l1]
uj5u.com熱心網友回復:
l0=['Localisation level 2 AM', 'Rang', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3', 'Unnamed: 5', 'Unnamed: 6']
l1=['Localisation level 2 AM', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3']
# for e in l0:
# if e in l1:
# l0.remove(e)
# print(l0)
l2 = []
for x in l0:
if x not in l1:
l2.append(x)
l0 = l2
print(l0)
['Rang', 'Unnamed: 5', 'Unnamed: 6']
uj5u.com熱心網友回復:
見https://sopython.com/canon/95/removing-items-from-a-list-while-iterating-over-the-list/
這樣做的原因是迭代器不知道串列元素被洗掉了,并且愉快地前進到下一項。
更好的解決方案是使用串列理解:
l0 = [e for e in l0 if not e in l1]
print(l0)
或反向迭代:
for e in reversed(l0):
if e in l1:
l0.remove(e)
或迭代串列的副本:
for e in list(l0):
if e in l1:
l0.remove(e)
uj5u.com熱心網友回復:
將 l0 串列復制到另一個變數。您在遍歷串列時正在洗掉專案,所以這就是您的問題。另外,l.remove應該看起來像l0.remove,因為l沒有定義
import copy
l0=['Localisation level 2 AM', 'Rang', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3', 'Unnamed: 5', 'Unnamed: 6']
l1=['Localisation level 2 AM', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3']
l00 = copy.copy(l0)
for e in l0:
if e in l1:
print(e)
l00.remove(e)
print(l00)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347427.html
上一篇:如何重新排序嵌套串列中的元素?
下一篇:js過濾多頁串列
