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