2015-10-18 85 views
2

我正在嘗試編寫一個名爲「k_largest(input,output)」的函數,它接受兩個Python數組列表,然後用輸入的最大數字填充輸出列表按升序排列,具體取決於輸出列表的大小。Python:輸出列表= x輸入列表的最大數量

測試是:

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] 

我敢肯定有這樣做還有一個更有效的方法。

+1

避免使用'list'作爲變量名稱,因爲它會影響內置方法'list()'。 –

+0

只需使用['heapq.nlargest'](https://docs.python.org/library/heapq.html) –

回答

3

您不會替換輸出中的值,只是將新列表分配給函數的輸出標籤,因此調用輸出將始終爲[0,0,0]。
您需要使用切片分配得到就地更新:

output[:] = input 

這樣,在更新傳入的參數。

如果按升序排序返回排序列表,那麼你可以採取的最後len(output) VS第一和扭轉,如:

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
sorted(input)[:len(output)] 

上述代碼行提供了對排序列表的切片的新引用。

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]與對象在蟒蛇傳遞的方式和可變對象在被調用的處理方式做功能。下面是對https://stackoverflow.com/a/986145/1709397

一個很好的解釋更簡單地說,通過重新分配參數輸出在功能 k_largest(...)與下面的語句中,我們導致它指向內存中的新位置。

def k_largest(input, output): 
    ... 
    output = list(input) 
    ... 

因此,對原始列表的引用丟失。