我正在尝试编写一个名为“k_largest(input,output)”的函数,它接受两个Python数字列表,然后按输出列表的最大数量按升序填充输出列表,具体取决于输出列表。
测试是:
input = [50, 30, 60, 10, 0, 40]
output = [0, 0, 0]
k_largest(input,output)
print(output)
答案:
[40, 50, 60]
这是我的代码:( merge_sort函数仅用于将输入列表按降序排序。)
def k_largest(input, output):
merge_sort(input)
input = input[:len(output)]
input = input[::-1]
output = list(input)
print (output)
def merge_sort(list):
count = 0
for index in range(1, len(list)):
value = list[index]
i = index - 1
while i >= 0:
if value > list[i]:
list[i+1] = list[i]
list[i] = value
i = i - 1
count = count + 1
else:
break
出于某种原因,我的代码只是输出原始输出列表而不是新输出列表。
例如:
[0, 0, 0]
而不是:
[40, 50, 60]
我非常确定这样做也是一种更有效的方法。
答案 0 :(得分:3)
您不是要替换输出中的值,只是为函数的输出标签指定一个新列表,因此调用输出将始终为[0,0,0]。 您需要使用切片分配来获取就地更新:
output[:] = input
这样传入的参数就会更新。
如果以升序排序返回排序列表,则可以使用最后一个len(output)
与第一个相反并进行反转,例如:
output[:] = input[-len(output):] # last 3 items
注意:您不应该将您的参数调用merge_sort()
list
,因为这会与Python的列表类型发生冲突。
但是,我并不是这种副作用的忠实粉丝,宁可传递一个长度并返回一个列表,例如:
def k_largest(input, n):
return sorted(input)[-n:]
>>> input = [50, 30, 60, 10, 0, 40]
>>> output = k_largest(input, 3)
>>> print(output)
[40, 50, 60]
如果你真的必须分配给输出:
def k_largest(input, output):
output[:] = sorted(input)[-len(output):]
>>> input = [50, 30, 60, 10, 0, 40]
>>> output = [0]*3
>>> k_largest(input, output)
>>> print(output)
[40, 50, 60]
答案 1 :(得分:1)
sorted(input)[:len(output)]
上面的代码行提供了对排序列表片段的新引用。
答案 2 :(得分:1)
@Newbie:
要按输出列表的最大数量按升序填充输出列表,具体取决于输出列表的大小,您可以尝试
def k_largest(input, output):
merge_sort(input)
input = input[:len(output)]
input = input[::-1]
output[:len(output)] = input[:len(output)]
print (output)
原始程序显示[0,0,0]而不是[40,50,60]的原因与在python中传递对象的方式以及在被调用函数中处理可变对象的方式有关。这是https://stackoverflow.com/a/986145/1709397
的一个很好的解释更简单一点,通过使用以下语句在函数 k_largest(...)中重新分配参数 output ,我们使它指向一个新位置在记忆中。
def k_largest(input, output):
...
output = list(input)
...
因此,对原始列表的引用将丢失。