2017-07-20 15 views
1

私は、リストの解説とPep 8の読み方について学んだことを適用するために取り組んでいます。私は文法的なジレンマに陥っています。まず、コード:私にPythonで、複雑なリストの理解のスタイルを設定する方法

# Using nested for's and conditionals 
for m, row in enumerate(board): 
    for n, piece in enumerate(row): 
     if (piece == self.color or piece == self.Color): 
      print(m, n, piece) 

# Using list comprehensions 
[ 
    [ 
     print(m, n, piece) 
     for n, piece in enumerate(row) 
     if (piece == self.color or piece == self.Color) 
    ] 
    for m, row in enumerate(board) 
] 

、私はそれが少しより直感的に見えるだけで(私には)ので、ネストされた者のためのアプローチの方に傾くのペップ8並べ替えを思うだろう。たぶん私は十分にリストの理解のフォーマットに近づいていないでしょう。それは79 col優先ラップを維持しながらフォーマットすると思うと最高です。

私はこの時点でリスト内包を十分に把握していると思いますが、このアプリケーションには間違いなく適していますが...リスト内包を使用するためにリスト内包を使用する方が望ましいですか?

多分私のコードアーキテクチャを完全に再考する必要がありますか?私はSOにこのような勧告をすることを期待していませんが(!)、上記のどのアプローチがPythonistを探すのが良いかについてのいくつかの洞察をかもしれません!

編集:推奨される重複した質問(質問の作成時に推奨された回答の中にこのポップアップが表示されない場合は、質問しませんでした!:D)がこの問題を完全に解決します。私は、リスト内包の「副作用」が意味することをもっと読んでおくべきだったと思います。それは間違いなく私の疑問に当てはまるようです。

Here's the duplicate linkは、ケース内の重複マークが削除される:

をいつものように、SO素晴らしい答えをありがとう!

+3

副作用のためにリストの内包表記を使用することをお勧めしません。ちょうどループを使用してください。 – AChampion

+0

あなたが投稿したコードは、リスト内包表記の中にある印刷のために構文エラーが発生します。あなたは '' 'print [[(m、n、piece)for ...]]を意味するかもしれません。' '' – perigon

+0

@ user55449正しいバージョンのPythonを使用していますか? – AChampion

答えて

2

私は上記の方法が読みやすくすると思います。 リスト内包表記は何かをするためのリストを生成しません...それは単なる副作用です。

for m, row in enumerate(board): 
    for n, piece in enumerate(row): 
     if piece == self.color or piece == self.Color: 
      print(m, n, piece) 

これで十分です。

またはリスト内包表記を使用してリストを生成し、このように印刷する必要があります。

result = [ 
    [ 
     (m, n, piece) 
     for n, piece in enumerate(row) 
     if piece == self.color or piece == self.Color 
    ] 
    for m, row in enumerate(board) 
] 
print (result) 

または

for res in result: 
    m, n, piece = res 
    print (m, n, piece) 
関連する問題