代码之家  ›  专栏  ›  技术社区  ›  user2884440

Python-更改列表中的两个值[重复]

  •  0
  • user2884440  · 技术社区  · 11 年前
    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 回复  |  直到 11 年前
        1
  •  1
  •   mgilson    11 年前

    我认为你误解了 or 操作人员Python首先评估 i1 。如果它是真的(在您的情况下,为非零),那么python执行该块,而不考虑第二个条件。您真正想要的是第一个条件也检查索引是否对列表有效。即应为:

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

    此外,顺便说一句,在python中交换elment的一个常见习惯用法是:

    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