roll_number = [47, 64, 69, 37, 76, 83, 95, 97]
sample_dict = {'Jhon':47, 'Emma':69, 'Kelly':76, 'Jason':97}
for a in roll_number:
if a not in sample_dict.values():
roll_number.remove(a)
print(roll_number)
我的輸出是 [47, 69, 76, 95, 97] 而不是 [47, 69, 76, 97]。有人可以解釋一下嗎?
uj5u.com熱心網友回復:
我看到的問題是您在從陣列中洗掉專案的同時迭代陣列。這會導致不安全的移除。
您可以使用 aset來“凍結”陣列并安全地洗掉其值:
roll_number = [47, 64, 69, 37, 76, 83, 95, 97]
sample_dict = {'Jhon':47, 'Emma':69, 'Kelly':76, 'Jason':97}
roll_set = set(roll_number)
for a in roll_number:
if a not in sample_dict.values():
roll_set.remove(a)
print(roll_set)
它會列印出來{97, 69, 76, 47}。如果你想要一個串列,你可以使用list(roll_set).
Althoug set是標準的 python 型別,您也可以使用另一個臨時串列并獲得相同的結果。
uj5u.com熱心網友回復:
您在迭代串列時洗掉元素。(壞主意)在迭代串列時洗掉元素會影響迭代器。
正如這里提到的,有幾種方法:
- 使用串列推導創建一個僅包含您不想洗掉的元素的新串列
- 創建原始串列的副本
- 通過分配給切片
somelist[:],您可以改變現有串列以僅包含您想要的專案 - 利用
itertools - 向后迭代
uj5u.com熱心網友回復:
我相信會發生這種情況,因為您在回圈存在陣列時從陣列中洗掉了一個值,只需復制現有陣列并洗掉副本的值
import copy
roll_number = [47, 64, 69, 37, 76, 83, 95, 97]
sample_dict = {'Jhon': 47, 'Emma': 69, 'Kelly': 76, 'Jason': 97}
roll_number_b = copy.deepcopy(roll_number)
for a in roll_number:
if a not in sample_dict.values():
roll_number_b.remove(a)
print(roll_number_b)
#output: [47, 69, 76, 97]
uj5u.com熱心網友回復:
我會使用串列理解:
[x for x in roll_number if x in sample_dict.values()]
[47, 69, 76, 97]
您可以在此問題中看到示例:
迭代時如何從串列中洗掉專案?
uj5u.com熱心網友回復:
這是因為result正在回圈中更新。
要了解代碼的行為,請考慮以下示例:
>>> lst = [1, 2, 3]
>>> lst.pop(0)
1
>>> lst.pop(1)
3
您可以使用此代碼獲得預期的輸出(使用while回圈并僅在元素未洗掉時遞增回圈計數器):
i = 0
while i < len(roll_number):
if roll_number[i] not in sample_dict.values():
roll_number.pop(i)
else:
i = 1
輸出
使用上述代碼和給定輸入的輸出是:
[47, 69, 76, 97]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488859.html
上一篇:將字典值添加到資料框列名
下一篇:用單個反斜杠替換雙倍
