coins=[100,50, 20, 10, 5, 2, 1]
n=10
for el in coins:
if el>n:
coins.remove(el)
print coins
上面的程序应该删除列表硬币中大于 10 的所有元素 所需的输出是
[10, 5, 2, 1]
但我得到
[50, 10, 5, 2, 1]
出了什么问题...
coins=[100,50, 20, 10, 5, 2, 1]
n=10
for el in coins:
if el>n:
coins.remove(el)
print coins
上面的程序应该删除列表硬币中大于 10 的所有元素 所需的输出是
[10, 5, 2, 1]
但我得到
[50, 10, 5, 2, 1]
出了什么问题...
迭代列表时不应更改列表。尝试使用列表推导:
coins = [el for el in coins if el <= n]
迭代时不应该删除元素的原因是它可能导致其他元素被跳过。例如,假设我们b
要从列表中删除[a, b, c, d]
:
----------------- | 一个 | 乙 | c | d | ----------------- ^(我们在 b 上) ----------------- | 一个 | | c | d | ----------------- ^(删除 b) ------------- | 一个 | c | d | ------------- ^(向下移动列表元素以填补空缺) ------------- | 一个 | c | d | ------------- ^(步骤)
请注意,我们跳过了c
.
你也可以用一个while循环来做
while i < len(coins):
if coins[i] > n:
coins.pop(0)
else:
i+=1