web-dev-qa-db-ja.com

ネストされたリストの理解について

ネストされたリストの理解を理解したい。以下に、リスト内包表記とそれらに相当するforループをリストします。
それらについての私の理解は正しいのだろうか。

例えば、

[(min([row[i] for row in rows]),max([row[i] for row in rows])) 
for i in range(len(rows[0]))]

に等しい

result=[]
for i in range(len(rows[0])):
  innerResult=[]
  for row in rows:
    innerResult.append(row[i])
  innerResult2=[]
  for row in rows:
    innerResult2.append(row[i])
  Tuple=(min(innerResult), max(innerResult2))
  result.append(Tuple)

私が一般化できれば、私は推測する

[exp2([exp1 for x in xSet]) for y in ySet]

フォームは次のように翻訳できます。 (私はこれで正しいことを願っています)

result=[]
for y in ySet:
  innerResult =[]
  for x in xSet:
    innerResult.append(exp1)
  exp2Result = exp2(innerResult)
  result.append(exp2Result)

より簡単な場合、

[exp1 for x in xSet for y in ySet] 

等しい

result=[] 
for x in xSet:
  for y in ySet: 
    result.append(exp1)

一方、

[[exp1 for x in xSet] for y in ySet]

等しい

result=[]
for y in ySet:
  innerResult=[]
  for x in xSet:
    innerResult.append(exp1)
  result.append(innerResult)

複雑なリスト内包表記のループ式と同等 で同様の質問をしました
そこに与えられた答えは、内部で何をするかを理解した後、フォームを再構築します。
体系的にどのように機能するかを知りたいので、他のわずかに異なる例にこの概念を適用できます。

71
eugene

短い答えは:はい、あなたはあなたの理解が正しいです

落とし穴があります。通常、pythonコードでネストされたリストの内包表記を使用する方法は、多次元配列を操作することです。

典型的な例は、行列を操作する場合です。

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> [[el - 1 for el in row] for row in matrix]
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

ご覧のとおり、「ネスト」は、マトリックスの各次元を操作することで機能します。

あなたが提供した例では、ySet [不幸な名前btw、setsはpythonで提供されるタイプの1つです]は単なる汎用カウンタであり、内部で行われていることを追跡するのが少し難しくなります。

最初の例として:

>>> rows = ([1, 2, 3], [10, 20, 30])
>>> [(min([row[i] for row in rows]),max([row[i] for row in rows])) for i in range(len(rows[0]))]
[(1, 10), (2, 20), (3, 30)]

Zip 組み込み関数を調べてください:

>>> Zip(rows[0], rows[1])
[(1, 10), (2, 20), (3, 30)]

または簡潔さと優雅さを最大限に高めるには:

>>> Zip(*rows)
[(1, 10), (2, 20), (3, 30)]

HTH!

70
mac

確かに、あなたは正しいです。これについては、 Python Language Reference のExpressionsセクションで詳細に説明されています。

特に、単一のリスト内包表記でいくつかのforsをネストする順序に注意してください。これは常に左から右です。

>>> matrix = [[1, 2], [3, 4]]
>>> [item for item in row for row in matrix] # oops!
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    [item for item in row for row in matrix]
NameError: name 'row' is not defined
>>> [item for row in matrix for item in row] # nesting is in left-to-right order
[1, 2, 3, 4]
72
taleinat