2016-11-06 2 views
0

이 함수는 숫자의 2 차원 테이블 (숫자 목록의 목록) 인 단일 인수를 취하여 목록을 반환합니다 테이블에있는 최대 요소의 위치를 ​​나타내는 2 개의 숫자로 구성됩니다. 예를 들어, 최대 요소의 table [2] [0], 함수는 목록 [2, 0]을 반환합니다. 당신이 원하지 않는 경우숫자 목록의 2D 테이블

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] 

: 당신은 같은 itertools.chain()을 사용할 수 있습니다

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

코드에서 현재 작동하지 않는 부분을 설명하십시오. 또한 코드가 자신의 코드의 정확한 표현임을 확인하기 위해 자신의 들여 쓰기 (indentation)를 수정하면 도움이 될 것입니다. – idjaw

+0

나는 함수가 수행해야하는 스크린 샷을 가지고 있습니다. 나는 가장 큰 숫자가 목록의 목록에있는 곳에서 색인을 식별하기로되어있다. 그래서 인덱스의 행과 열을 찾으려고합니다. 목록 목록에서 가장 큰 숫자가 60이고 첫 번째 목록의 마지막 숫자 인 경우 my 함수는 [0,2]를 반환해야합니다. 나는 혼란스러워서 어디서부터 시작해야할지 모릅니다. – tholme

답변

1

지금까지 내가 가지고

Example of output

: 아래 아래 테스트 실행의 커플 모듈을 가져 오면 다음과 같이 함수를 만들 수 있습니다.

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]