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