0

私のプログラム、リストからいくつかのアイテムを削除したい:

num_str = input('Enter a number: ')
num_num = int(num_str)

fac_list = list(range(1, num_num + 1))
print("BEFORE: ", fac_list)

for item in fac_list:
    if num_num % item == 0:
        fac_list.remove(item)

print("AFTER: ",fac_list)

出力:

Enter a number: 8
BEFORE:  [1, 2, 3, 4, 5, 6, 7, 8]
AFTER:  [2, 3, 5, 6, 7]

そのはず:

[3, 5, 6, 7]

どうしたの?

4

2 に答える 2

0

あなたはそれを繰り返してlist削除していますが、それはあなたが望むようには機能しません。これは、リストを反復処理しているときに for ループが現在のインデックスを追跡するためですが、リストから項目を削除するとインデックスが変更され、一部の要素の反復処理をスキップしてしまう可能性があります。

(古いリストから削除する代わりに)必要な値を使用して新しいリストを作成するだけで、リスト内包表記を使用してこれを行うことができます-

fac_list[:] = [x for x in fac_list if num_num % x != 0:]

左側のスライス表記はこれをインプレースにするためのものなので、インプレースにfac_list変更しています。

削除する (新しいリストを作成しない) 場合は、そのコピーを反復処理する必要があります。例 -

for item in fac_list[:]:
    if num_num % item == 0:
        fac_list.remove(item)
于 2015-08-05T01:53:52.493 に答える
0

私はAnand S Kumarのソリューションを試していませんが、新しいリストを生成する代わりに、逆方向に繰り返すことができるので、アイテムを削除していても、反復するインデックスには影響しません.

num_str = input('Enter a number: ')
num_num = int(num_str)

fac_list = list(range(1, num_num + 1))
print("BEFORE: ", fac_list)

for i in range(len(fac_list)-1, -1, -1): # Iterate backwards instead
    item = fac_list[i]
    if num_num % item == 0:
        fac_list.remove(item)

print("AFTER: ",fac_list)

出力:

('AFTER:', [3, 5, 6, 7])

于 2015-08-05T02:00:10.123 に答える