我试图在有序列表中添加值,但列表不会发生变化:
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作为返回但我希望该功能在列表上工作。
答案 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)