coins=[100,50, 20, 10, 5, 2, 1]
n=10
for el in coins:
if el>n:
coins.remove(el)
print coins
上記のプログラムは、10 より大きいリストcoinsのすべての要素を削除することになっています。望ましい出力は次のとおりです。
[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 より大きいリストcoinsのすべての要素を削除することになっています。望ましい出力は次のとおりです。
[10, 5, 2, 1]
しかし、私は得ています
[50, 10, 5, 2, 1]
何がうまくいかない...
反復処理中にリストを変更しないでください。代わりにリスト内包表記を使用してみてください。
coins = [el for el in coins if el <= n]
反復中に要素を削除してはならない理由は、他の要素がスキップされる可能性があるためです。たとえばb、リストから削除したいとし[a, b, c, d]ます。
-----------------
| | | | b | 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