1. ホーム
  2. python

ネストされたリストの理解を深める

2023-11-11 05:51:12

質問

リスト内包のネストを理解したいです。 以下に、リスト内包の式と、それに相当する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)

私は同様の質問を 複雑なリスト内包のためのループ表現に相当するもの

ここで示された答えは、内部で何を行っているかを理解した上で、フォームを再構築するものです。

他の少し変わった例にも応用できるように、体系的に仕組みを知りたいです。

どのように解決するのですか?

簡単に言うと はい、あなたはあなたの理解で正しいです .

ただ、キャッチがあります: 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]]

ご覧のように、quot;nesting" は行列の各次元で操作することによって機能します。

提供された例では、どうやら ySet のように [残念な名前ですが セット は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!