为什么列表不会改变?

时间:2017-08-08 16:57:45

标签: python

我试图在有序列表中添加值,但列表不会发生变化:

def insert(V, x):

    if len(V)!=0:

        for i in range( 0 , len(V)-1):
            if (V[i]<=x)and(V[i+1]>=x):
                V=V[0:i+1]+[x]+V[i+1:len(V)]
                print("\nExpected: \n"+ repr(V))
                return

    V=V+[x]
    return

我有这个:

V=[1,2,3,4,5,6,7,8,9,10]
insert(V, 6)
print("\nResult: \n"+ repr(V))enter code here

这就是结果:

Expected: 
[1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10]

Result: 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我可以解决问题设置V作为返回但我希望该功能在列表上工作。

4 个答案:

答案 0 :(得分:1)

您可以使用list.insert简单地完成所做的工作。

至于为什么你的函数不起作用,你需要使用 full-slice 赋值来更新原始列表,这样传递给函数的列表就会通过当前引用更新{{1 }}:

V

请注意,RHS(右侧)是一个新的列表对象。仅分配给... V[:] = V[0:i+1] + [x] + V[i+1:len(V)] # ^ 会将名称/变量重新绑定到新的列表对象。但是,使用切片分配可确保使用新列表中的值更新原始列表。

答案 1 :(得分:0)

您可以将您的值附加到列表中,然后对其进行排序

l.append(值)

l.sort()

答案 2 :(得分:0)

您的功能不会改变V

V=V[0:i+1]+[x]+V[i+1:len(V)]

在此行之后,V不再是对传递给函数的列表的引用,而是另一个列表。此行不会更改第一个列表,但会创建一个新列表。

您必须return V然后获取结果或在V上调用方法,例如list.insert()

答案 3 :(得分:-1)

正如其他人所指出的那样,你没有修改原始列表。 (相反,您正在创建一个新列表,然后不返回它。)

这是一个利用list.insert修改现有列表的解决方案:

def insert(lst, value):
    '''Insert a value into a sorted list in-place, while maintaining sort order'''

    for i, x in enumerate(lst):
        if x > value:
            lst.insert(i, value)
            return

    # fallback, in case this is the new largest
    lst.append(value)

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
insert(a, 6)
print(a)  # [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10]

修改

更紧凑,但可能更难阅读:

def insert(lst, value):
    lst.insert(next((i for i, x in enumerate(lst) if x > value), len(lst)), value)