2

リストを調べてすべての奇数を削除する関数を作成しようとしています。ループが範囲外になり、修正方法がわからないという問題があります。誰か助けてもらえますか? ありがとう

def isEven(number):
    if(number % 2) == 0 and (number != 0):
        return True
    else:
        return False

def only_even(intList):
    for i in range(0, len(intList)):
        if(isEven(intList[i])) == False:
           del intList[i]
    return intList

print(only_even([5, 8, 17, 6, 0, 20, 3]))
4

3 に答える 3

2

リストが範囲外になる理由は、リストを縮小しながら元のサイズの範囲を反復しているためです!

def only_even(intList):
    intList[:] = [i for i in intList if isEven(i)]
    return intList

[:]リストを変更して返すという正確なセマンティクスを保持するために、スライスの割り当てを行っています。リストを返したいだけの場合は、さらに短くなります

def only_even(intList):
    return [i for i in intList if isEven(i)]

すでに真/偽に評価されるため、偶数関数を単純化することもできます

def isEven(number):
    return number % 2 == 0 and number != 0   # Why isn't 0 even?
于 2013-03-15T15:00:27.827 に答える
2

を使用するdelと、リストの長さが変更されますが、forループはリストの元の長さを反復しようとするため、最終的にはリストの範囲外になります。つまり、ループlen(intList)のたびに評価されるわけではありません。for

これに対する解決策は、古いリストから新しいリストを作成し、次のように返すことです。

def only_even(intList):
    new_list = []
    for i in range(0, len(intList)):
        if isEven(intList[i]) == True:
            new_list.append(intList[i])
    return new_list

これで、print ステートメントが機能します。

>>> print(only_even([5, 8, 17, 6, 0, 20, 3]))
[8, 6, 20]
于 2013-03-15T15:17:41.460 に答える
1
def only_even(intList):
    intList[:] = filter(isEven, intList)
    return intList

または、リストをその場で変更する必要がない場合:

def only_even(intList):
    return list(filter(isEven, intList))
于 2013-03-15T15:03:46.117 に答える