Nice programing

중첩 된 목록 이해 이해

nicepro 2020. 10. 26. 21:04
반응형

중첩 된 목록 이해 이해


중첩 된 목록 이해를 이해하고 싶습니다. 아래에 목록 이해 표현식과 이에 상응하는 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)

복잡한 목록 이해를위한 Equivalent for 루프 표현에 대해 비슷한 질문을했습니다.
거기에 주어진 답변은 내부적으로 무엇을하는지 이해 한 후 양식을 재구성합니다.
나는 그것이 체계적으로 어떻게 작동하는지 알고 싶다. 그래서 나는 다른 약간 다른 예에 개념을 적용 할 수있다.


짧은 대답은 : 예, 당신은 당신의 이해가 정확합니다 .

한 가지 문제가 있습니다. 일반적으로 파이썬 코드에서 중첩 된 목록 이해를 사용하는 방법은 다차원 배열에서 작동하는 것입니다.

일반적인 예는 행렬에서 작업하는 경우입니다.

>>> 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, 세트 는 파이썬과 함께 제공되는 유형 중 하나이기 때문에]는 단지 일반적인 카운터 일 뿐이며 내부에서 일어나는 일을 따라 가기가 조금 더 어려워집니다.

첫 번째 예는 다음과 같습니다.

>>> 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!


사실, 당신이 맞습니다. 이것은 Python Language ReferenceExpressions 섹션 에 자세히 설명되어 있습니다.

Note especially the order of nesting of several fors in a single list comprehension, which is always left-to-right:

>>> 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]

참고URL : https://stackoverflow.com/questions/8049798/understanding-nested-list-comprehension

반응형