Python:输出列表= x输入列表的最大数量

时间:2015-10-18 05:11:53

标签: python

我正在尝试编写一个名为“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]

我非常确定这样做也是一种更有效的方法。

3 个答案:

答案 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)
    ... 

因此,对原始列表的引用将丢失。