0
def troca_valor(lista, i1, i2):
    a = lista[:]
    tam = len(lista)
    if i1 or i2 > tam:
        return None
    else:
        a[i1] = lista[i2]
        a[i2] = lista[i1]
        return a

assert troca_valor([0,1,2,3],2,0) == [2,1,0,3]
assert troca_valor(["a", "e", "i", "o", "u"],1,3) == ["a", "o", "i","e", "u"]
assert troca_valor([0,1,2,3],7,3) == None
assert troca_valor([0,1,2,3],2,5) == None

アサートのように、リストの値を1つずつ変更する必要があります。このコードのようなことをしようとしていますが、アサートエラーが表示されます。これは私の最初の質問です。検索を使用しましたが、同様の質問はありませんでした。私の英語でごめんなさい。

4

1 に答える 1

1

orオペレーターを誤解していると思います。Python は最初に の真偽を評価しi1ます。true の場合 (あなたの場合はゼロ以外)、python は 2 番目の条件を確認せずにそのブロックを実行します。本当に必要なのは、最初の条件でインデックスがリストに対して有効かどうかもチェックすることです。つまり、次のようになります。

if i1 > tam or i2 > tam:
   ...

また、余談ですが、Python で要素を交換するための一般的なイディオムは次のとおりです。

a, b = b, a

したがって、コードの作業バージョンは次のようになります。

def troca_valor(lista, i1, i2):
    a = lista[:]
    tam = len(lista)
    if i1 > tam or i2 > tam:
        return None
    else:
        a[i1], a[i2] = lista[i2], lista[i1]
        return a

assert troca_valor([0,1,2,3],2,0) == [2,1,0,3]
assert troca_valor(["a", "e", "i", "o", "u"],1,3) == ["a", "o", "i","e", "u"]
assert troca_valor([0,1,2,3],7,3) == None
assert troca_valor([0,1,2,3],2,5) == None
于 2013-10-15T23:21:24.710 に答える