2016-11-21 115 views
0

下面的代碼創建了輸入的值的列表:最大的價值在列表陣列

def locateLargest(): 

    matrix = [] 
    numberOfRows = int(input("Enter the number of rows: ")) 
    numberOfColumns = 2 

    for row in range(0, numberOfRows): 
     matrix.append([]) 
     for column in range(0, numberOfColumns): 
      value = int(input("Enter a value: ")) 
      matrix[row].append(value) 


    max_value = None 
    for value in matrix: 
     if not max_value: 
      max_value = value 
     elif value > max_value: 
      max_value = value 
    print(max_value) 

locateLargest() 

我遇到的問題是,它是要求該行中的每個值的個體,並返回最大對行中的值,而不是最大值的索引。

的是我應該得到的樣品運行:

Enter the number of rows in the list: 3 
Enter a row: 23.5 35 2 10 
Enter a row: 4.5 3 45 3.5 
Enter a row: 35 44 5.5 11.6 
The location of the largest element is at (1,2) 

任何想法?

我的電流輸出爲:

Enter the number of rows: 2 
Enter the number of columns: 6 
Enter a value: 2 
Enter a value: 2 
Enter a value: 2 
Enter a value: 2 
Enter a value: 2 
Enter a value: 2 
Enter a value: 7 
Enter a value: 6 
Enter a value: 4 
Enter a value: 3 
Enter a value: 6 
Enter a value: 2 
[7, 6, 4, 3, 6, 2] 
+1

你迭代的名單列表,所以每個'value'是_list_。您需要考慮從每個列表中檢索各個值,以便執行相關比較。 –

回答

1

這是不是很「Python化」,但將幫助你實現你的最終目標,希望瞭解這個過程。正如盧卡斯所說,你需要爲每一行做一個迭代,併爲每個行中的每一列:

首先聲明的變量來存儲您的位置:

maxPoint = [0,0] 

然後列舉你的矩陣,這樣你可以得到各行之列,但也檢索當前活動行的索引:

for idx, row in enumerate(matrix): 

中值的當前列表中找到的最大值,即:[10, 20, 30]

maxRowValue = max(row) 

找到這個最大值住在哪一列,即:[0, 1, 2, ...]

maxRowIndex = row.index(maxRowValue) 

確定最大行值實際上比任何其他以前的對應點時,如果是少丟棄它:

if maxRowValue <= matrix[maxPoint[0]][maxPoint[1]]: 
      continue 

如果該值越大,將其保存到maxPoint變量:

maxPoint = [idx, maxRowIndex] 

編輯

爲了完整起見,這裏是AChampion的性能改進的完整代碼示例說:

def locateLargest(): 

    matrix = [] 
    numberOfRows = int(input("Enter the number of rows: ")) 
    numberOfColumns = 2 

    for row in range(0, numberOfRows): 
     matrix.append([]) 
     for column in range(0, numberOfColumns): 
      value = int(input("Enter a value: ")) 
      matrix[row].append(value) 

    maxPoint = [0,0] 

    for rIndex, row in enumerate(matrix): 
     cIndex, maxRowValue = max(enumerate(row), key=lambda x: x[1]) 
     if maxRowValue <= matrix[maxPoint[0]][maxPoint[1]]: 
      continue 
     maxPoint = [rIndex, cIndex] 

    print(maxPoint) 

locateLargest() 

EDIT 2

這裏是相同的算法,而不使用枚舉:

currentRow = 0 

for row in matrix: 
    maxRowValue = max(row) 
    maxRowIndex = row.index(maxRowValue) 
    if maxRowValue > matrix[maxPoint[0]][maxPoint[1]]: 
      maxPoint = [currentRow, maxRowIndex] 
    currentRow += 1 
+0

這很有趣,自從發佈以來一直在玩它。我遇到的唯一問題是,如果最終有2個值大於起始值。它取代了它,但最終打印出的都是較大的。例如:如果除了1和12之外什麼都不輸入,它將打印12的索引......但是如果你有很多高數字,它會打印最高的數字2. –

+0

它輸出索引的索引座標矩陣中的最大值?我不知道''你的意思是'打印兩個更大' – axlj

+1

'enumerate()'是你的朋友,而不是找到'max',然後找到'index',你可以找到兩個例如。 'index,value = max(枚舉(row),key = lambda x:x [1])' – AChampion

0

使用enumerate()和一些發電機表達式,可以減少這種代碼頗有幾分:

  • 生成行
  • 生成的每一行
  • 最大所有行找出最大

也許比一些更復雜:

numberOfRows = int(input("Enter the number of rows: ")) 
# Generate the rows 
rows = (map(int, input("Enter a row: ").split()) for _ in range(numberOfRows)) 

# Generate the maximum for each row 
max_row = (max(enumerate(data), key=lambda x: x[1]) for data in rows) 

# Find the maximum across all rows 
i, (j, v) = max(enumerate(max_row), key=lambda x: x[1][1]) 
print("The location of the largest element is at {} [{}]".format((i, j), v)) 

輸入/輸出放:

Enter the number of rows: 3 
Enter a row: 1 2 3 
Enter a row: 3 6 3 
Enter a row: 1 2 3 
'The location of the largest element is at (1, 1) [6]' 

如果你想看看發生了什麼變化發電機同list解析:

>>> rows = [list(map(int, input("Enter a row: ").split())) for _ in range(numberOfRows)] 
Enter a row: 1 2 3 
Enter a row: 3 6 3 
Enter a row: 1 2 3 
>>> rows 
[[1, 2, 3], [3, 6, 3], [1, 2, 3]] 
>>> max_row = [max(enumerate(data), key=lambda x: x[1]) for data in rows] 
>>> max_row 
[(2, 3), (1, 6), (2, 3)] 
>>> list(enumerate(max_row)) 
[(0, (2, 3), (1, (1, 6)), (2, (2, 3))] 
       ^^^^^^^^^ 
       i, (j, v) 
+0

也許它是一個蟒蛇文化的東西,但我覺得我不知道爲什麼我在3個月內寫了這個或它的意思。 – axlj

+0

也許它有點複雜,但它們是python中相對標準的成語。 – AChampion

+0

我對枚舉和映射函數不是很熟悉。對他們做一點研究......很多東西要學:D –