2016-11-11 2 views
-1

リスト内包を使って行列内の最大値のようなものを見つける方法を学びたいと思います。Pythonのリスト内包の中でネストしたループ内で変数を代入する方法

これは、私がしたいことを簡略化したものです。

max_hourglass = 0 
[[max_hourglass = i+j for j in range(4) if j < 3] for i in range(4)] 
print(max) 

maxの割り当てに構文エラーが発生しました。私はちょうど問題があった場合に備えて、ijを整数にキャストしようとしましたが、そうではありません。

私はこのコードを使用しようとしているより複雑な問題は、HackerRankの質問を解決することです。私はすでにそれを解決しましたが、私は問題を解決するために異なるテクニックを使用してpython3の知識を広げようとしています。 This is the Hackerrank problem

ここでは、問題が異なる場合に備えて、より複雑な問題コードを示します。

[max_hourglass = (arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2]) for j in range(4) if (arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2]) > max_hourglass] for i in range(4)] 

:あなたは私は理解を一覧表示する削減しようとしている問題を見ることができるように

arr = [] 
for _ in range(6): 
    arr.append([int(num) for num in input().split()]) 

max_hourglass = 0 
for i in range(4): 
    for j in range(4): 
     hourglass = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2] 
     if hourglass > max_hourglass: 
      max_hourglass = hourglass 
print(max_hourglass) 

は、私は簡易版と同じロジックで、このコードを思い付いたためにループの入れ子になっています私はこれが読みにくいコードであることを完全に承知しており、これを本番環境では使用しませんが、むしろPythonのリストの理解構文をさらに理解したいと思っています。

ハッカーランクの問題は、形状(I)が砂時計の形をしている最大値の合計を2D配列(行列)で見つけることです。

1 1 1 0 0 0 
0 1 0 0 0 0 
1 1 1 0 0 0 
0 0 2 4 4 0 
0 0 0 2 0 0 
0 0 1 2 4 0 

は値として出力19につながる:

2 4 4 
    2 
1 2 4 

は19

+1

'max = ...'とは 'max(...)'を意味しますか? – TigerhawkT3

+2

リストの理解には割り当てを行うことはできません。ちょっと単純な '[i + j ...]' –

+1

あなたが何らかの競争のためのコードを書いているなら、あなたは自分のメリットと能力でそれを達成しなければならないと思います。その基本的な構文についての質問はボリューム。 – TigerhawkT3

答えて

2
まで追加

リストの内包表記はリストを生成するために使用されることになっています。いくつかの並べ替えの副作用のためにそれらを使用することはお勧めしません。そして、あなたの変数割り当ての場合、禁止されています。

は、それはあなたの問題は、その金型に適合しない場合は、リスト内包のように書かれて何のビジネスを持っていない効果で

result = [] 
for ...: 
    result.append(...) 

の省略形です。

複数のリスト内包表記を構築するのは完全に良い形式です。 maxのような関数を適用してリストを1つの変数に圧縮します。

list1 = [.... for i in list0] 
list2 = [.... for j in list1] 
mymax = max(list2) 

リストは、ジェネレータと辞書の補完で置き換えることができます。

解説は、計算をチャンクまたはビルディングブロックに分割することをお勧めします。チャンクまたはビルディングブロックは、より複雑な操作にまとめられます。ここで

+0

ありがとう、私は変数の割り当てがリストの理解に禁止されていることを認識していなかったし、私はそれを使用することに新しいので、私はその潜在的で正しい慣行に震えていた。私は将来それを使ってリストを作成するように努力するつもりです。 – joshuatvernon

1

はあなたのリストの内包は、さらに良い

arr = [] 
for _ in range(6): 
    arr.append([int(num) for num in input().split()]) 

max_hourglass = max([arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2] for i in range(4) for j in range(4)]) 

print(max_hourglass) 

です:これは完成競争からある与えられた

arr = [[int(num) for num in input().split()] for _ in range(6)] 

max_hourglass = max([arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2] for i in range(4) for j in range(4)]) 

print(max_hourglass) 
+1

リストの理解度を使って砂時計の値のリストを生成し、 'max()'関数を使って砂時計の値の最大値を見つけることで、これが正しいアプローチであることがわかります。ありがとうございました。 – joshuatvernon

1

...
2つのネストされたリストの内包、マスクと2ネストされた発電機を使用して式:

import itertools as it 

data = [[int(x) for x in input().split()] for _ in range(6)] 
mask = [(0,0), (0, 1), (0, 2), (1, 1), (2, 0), (2, 1), (2, 2)] 
print(max(sum(data[x+dx][y+dy] for dx, dy in mask) 
      for x, y in it.product(range(6-3+1), repeat=2))) 
関連する問題