2016-11-06 55 views
0

該函數採用單個參數,該參數是二維數字表(數字列表列表)並返回列表2個數字表示表格中最大元素的位置。例如,最大元素是table [2] [0],該函數返回列表[2,0]。下面是一對夫婦低於測試執行的:數字列表2D表格,返回表格中最大元素位置的2個數字列表

Example of output

到目前爲止,我有,

def maxPos2D(table): 
    l = [] 
    for i in range(len(table)): 
     for j in i: 
     if i > table: 
      continue 
      table[i][j] += 0 
    return l 
+0

我不太相信你的榜樣。你能否給你的函數提供一個真正有效的輸入,並輸出一個精確的有效輸出? – idjaw

+0

現在解釋什麼在代碼中不起作用。此外,如果您修復了自己的縮進以確保代碼是您自己的代碼的精確表示,那麼它會有所幫助。編輯 – idjaw

+0

我有一個功能應該執行的操作的屏幕截圖。我應該確定列表中最大數字的索引。所以,我試圖找到索引的行和列。如果列表中最大的數字是60,並且它是第一個列表中的最後一個數字,我的函數應該返回[0,2]。我只是很困惑,真的不知道從哪裏開始。 – tholme

回答

1

您可以使用itertools.chain()爲:

from itertools import chain 

def maxPos2D(table): 
    chained_list = list(chain(*table)) # create single list from table 
    max_val = max(chained_list) # find max value in list 
    max_index = chained_list.index(max_val) # find index of max value 
    columns = len(table[0]) # number of columns 
    return [max_index/columns, max_index%columns] # return [column, row] 

在你不想的情況下導入任何模塊,你可以創建一個功能爲:

def maxPos2D(table): 
    max_index_parent, max_val = 0, max(table[0]) # initialise values based 
    max_index_child = table[0].index(max_val)  # on 1st sub-list 
    for i, child in enumerate(table[1:], 1): 
     max_child_val = max(child) 
     if max_child_val > max_val: # update values based on each sub-list 
      max_index_parent, max_val = i, max_child_val 
      max_index_child = child.index(max_val) 
    return [max_index_parent, max_index_child] 

這是低效版本的程序,其複雜度爲O(n^2),因爲OP可能更容易理解。 不建議進場做它

def maxPos2D(table): 
    max_index_parent, max_index_child, max_val = None, None, None 
    for i, child in enumerate(table): 
     for j, val in enumerate(child): 
      if max_val is None or val > max_val: 
       max_index_parent, max_index_child, max_val = i, j, val 
    return [max_index_parent, max_index_child] 

採樣運行:

>>> maxPos2D([[1, 2, 4], [7, 8, 9], [4, 5, 6]]) 
[1, 2] 
+0

我會刪除第二個解決方案。爲什麼將O(n^2)解決方案顯示爲更簡單的版本?效率不高。只要堅持第一個解決方案。 – idjaw

+0

@idjaw:儘管效率較低,但考慮到用戶的技能集,我認爲他會發現它比第一種解決方案更容易理解。 –

+1

我不同意在沒有適當解釋的情況下顯示效率低下的解決方案。或者至少說明效率低下,第一種效率更高。讓你的答案更加清晰,並準確地表明你爲什麼要使用適當的免責聲明。你不是*僅僅爲這個特定的OP做這件事,而是意識到還有其他幾個用戶可能會閱讀這個,並且對你如何回答下一組讀者很重要。 – idjaw

0

搜索通過表和記錄的唯一的最高值,你找到

In [1]: x = [[5,3,4,22,1], [1,1,1,1,1], [4,4,4,4,4], [3,3,3,3,3]] 

In [2]: best_so_far = -999 

In [3]: for i in range(len(x)): 
    ...:  for j in range(len(x[i])): 
    ...:   if x[i][j] > best_so_far: 
    ...:    best_cords = [i,j] 
    ...:    best_so_far = x[i][j] 
    ...:    

In [4]: best_so_far 
Out[4]: 22 

In [5]: best_cords 
Out[5]: [0, 3] 
0

我認爲這可能最好將處理分成兩個單獨的函數,每個函數處理2D表格的不同維度。這樣每個只有一個目的,這使得它們各自相對容易理解。

def maxRowElement(row): 
    max_col_index, max_col_val = 0, row[0] 

    for i, val in ((i, val) for i, val in enumerate(row) if val > max_col_val): 
     max_col_index, max_col_val = i, val 

    return max_col_index, max_col_val 

def maxPos2D(table): 
    max_row_index, max_col_index, max_tbl_val = 0, 0, table[0][0] 

    for row_index, row in enumerate(table): 
     col_index, col_val = maxRowElement(row) 
     if col_val > max_tbl_val: 
      max_col_index, max_tbl_val = col_index, col_val 
      max_row_index = row_index 

    return [max_row_index, max_col_index] 


print(maxPos2D([[1]]))  # -> [0, 0] 
print(maxPos2D([[1,2]]))  # -> [0, 1] 
print(maxPos2D([[1,2], 
       [3,0]]))  # -> [1, 0] 
print(maxPos2D([[1,2,3], 
       [10,20,15], 
       [4,5,6]])) # -> [1, 1] 
print(maxPos2D([[1,2,3], 
       [10,20,15], 
       [4,5,60]])) # -> [2, 2] 
相關問題