2016-11-06 1 views
0

この関数は、数値の2次元テーブル(数値リストのリスト)である1つの引数を取り、リストを返します表中の最大要素の位置を示す2つの数字からなる。たとえば、最大要素のうちtable [2] [0]は、関数[2、0]を返します。あなたがしたくない場合は数値リストの2Dテーブルとテーブル内の最大要素の位置を示す2つの数字のリストを返す

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

あなたのコードで現在動作していないことを説明してください。また、あなた自身のインデントを修正して、コードが自分のコードの正確な表現であることを確認した場合は、助けになります。 – idjaw

+0

私は機能が何をするべきかのスクリーンショットを持っています。私は、最大の数字がリストのリストにあるところでインデックスを特定するはずです。だから、私はインデックスの行と列を見つけようとしています。リストのリストの中で最大の数字が60で、それが最初のリストの最後の数字だった場合、私の関数は[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

2番目の解決策を削除します。より簡単なバージョンとしてO(n^2)ソリューションを表示するのはなぜですか?あまり効率的ではありません。ちょうど最初の解決策に固執する。 – idjaw

+0

@ idjaw:それはあまり効率的ではありませんが、ユーザーのスキルセットを考えると、彼は最初の解決策の代わりに理解しやすくなると思います。 –

+1

私は適切な説明なしで非効率的な解決策を示していることに同意しません。あるいは少なくとも、それが非効率的で、最初の方が効率的であると説明してください。あなたの答えをより明確にし、適切な免責事項でそれをなぜ示しているのかを正確に示してください。あなたはこの特定のオペレーションのためにこれをやっているだけではありませんが、おそらくこれを読んでいる他のいくつかのユーザがいることに気づき、次の読者のためにどのように答えるかを考えておくことが重要です。 – 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

を見つけます処理を2つの別々の機能に分割するのが最善の場合があります。それぞれが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] 
関連する問題