단일 행 중첩 For 루프


102

행렬을 전치하는 파이썬으로이 함수를 작성했습니다.

def transpose(m):
    height = len(m)
    width = len(m[0])
    return [ [ m[i][j] for i in range(0, height) ] for j in range(0, width) ]

이 과정에서 단일 행 중첩 for 루프가 실행되는 방식을 완전히 이해하지 못한다는 것을 깨달았습니다. 다음 질문에 답하여 이해하도록 도와주세요.

  1. 이 for 루프가 실행되는 순서는 무엇입니까?
  2. 트리플 중첩 for 루프가 있다면 어떤 순서로 실행됩니까?
  3. 중첩되지 않은 동일한 for 루프와 동일한 것은 무엇입니까?

주어진,

[ function(i,j) for i,j in object ]
  1. for 루프 구조를 사용하려면 어떤 유형의 객체가 있어야합니까?
  2. i와 j가 object의 요소에 할당되는 순서는 무엇입니까?
  3. 다른 for 루프 구조로 시뮬레이션 할 수 있습니까?
  4. 이 for 루프가 유사하거나 다른 for 루프 구조로 중첩 될 수 있습니까? 그리고 그것은 어떻게 보일까요?

추가 정보도 감사합니다.

답변:


169

가장 좋은 정보 소스는 목록 이해에 대한 공식 Python 튜토리얼입니다 . 목록 이해는 for 루프와 거의 동일하지만 (확실히 모든 목록 이해는 for 루프로 작성 될 수 있음) for 루프를 사용하는 것보다 더 빠릅니다.

튜토리얼에서이 긴 목록 이해를보십시오 ( if부분은 이해를 필터링하고 if 문을 전달하는 부분 만 목록 이해의 마지막 부분에 전달됩니다 (여기 (x,y)).

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

이 중첩 된 for 루프와 정확히 동일합니다 (그리고 튜토리얼에서 언급했듯이 for와 if의 순서가 동일한 지 확인).

>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

목록 이해력과 for 루프 의 주요 차이점 은 for 루프의 마지막 부분 (무언가를 수행하는 곳)이 끝이 아닌 시작 부분에 있다는 것입니다.

귀하의 질문에 :

for 루프 구조를 사용하려면 어떤 유형의 객체가 있어야합니까?

반복 가능한 . (무한) 요소 집합을 생성 할 수있는 모든 개체입니다. 여기에는 컨테이너, 목록, 세트, ​​생성기 등이 포함됩니다.

i와 j가 object의 요소에 할당되는 순서는 무엇입니까?

중첩 된 for 루프에있는 것처럼 각 목록에서 생성 된 것과 정확히 동일한 순서로 할당됩니다 (첫 번째 이해의 경우 i에 대해 1 개의 요소를 얻은 다음 j의 모든 값, i에 대한 두 번째 요소, 그런 다음 j의 모든 값 등)

다른 for 루프 구조로 시뮬레이션 할 수 있습니까?

예, 이미 위에 표시되었습니다.

이 for 루프가 유사하거나 다른 for 루프 구조로 중첩 될 수 있습니까? 그리고 그것은 어떻게 보일까요?

물론입니다. 좋은 생각은 아닙니다. 예를 들어 다음은 문자 목록을 제공합니다.

[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]

이중 중첩에서 주문 선택을 유도 한 이유가 무엇인지 궁금합니다. 다른 방법이 더 자연 스럽습니다 (예에서 y 다음 x). 나는 3 년 동안 파이썬을 수행하고 (광범위하지는 않지만 여전히 ...) 그런 종류의 루프를 사용한 것을 깨달았습니다 !!
Thomas

@Thomas 나는 또한 다른 방법이 더 직관적이라고 생각합니다. 내가 생각하는 선택은 순전히 편리했습니다. 보다 직관적 인 방식으로 수행한다는 것은 나중에 문에서 찾을 때까지 해결되지 않은 기호를 처리해야한다는 것을 의미합니다. 종이에 각 도시의 city.bananastore에 대한 각 바나나의 각 banana.peel에 대해 구문 분석을 시도하십시오. 쉽지는 않습니다. 다른 방법은 훌륭하고 쉽습니다.
Pyjong

29

itertools.product전달하는 모든 이터 러블에서 값의 튜플을 생성하는 이터 러블을 반환하는에 관심이있을 수 있습니다 . 즉, itertools.product(A, B)폼의 모든 값 산출 (a, b)1, a값이 온 A하고 b값을 온 B. 예를 들면 :

import itertools

A = [50, 60, 70]
B = [0.1, 0.2, 0.3, 0.4]

print [a + b for a, b in itertools.product(A, B)]

이것은 다음을 인쇄합니다.

[50.1, 50.2, 50.3, 50.4, 60.1, 60.2, 60.3, 60.4, 70.1, 70.2, 70.3, 70.4]

전달 된 최종 인수 itertools.product가 "내부" 인수인지 확인하십시오 . 일반적으로 다음 과 같습니다.itertools.product(a0, a1, ... an)[(i0, i1, ... in) for in in an for in-1 in an-1 ... for i0 in a0]


4

우선, 첫 번째 코드는 for 루프 자체를 사용하지 않고 목록 이해력을 사용 합니다.

  1. 다음과 같을 것입니다.

    범위 (0, 너비)에서 j의 경우 : 범위 (0, 높이)에서 i의 경우 : m [i] [j]

  2. 거의 같은 방식으로 일반적으로 for 루프처럼 오른쪽에서 왼쪽으로 중첩됩니다. 그러나 목록 이해 구문은 더 복잡합니다.

  3. 이 질문이 무엇을 묻는 지 잘 모르겠습니다.


  1. 정확히 두 개의 객체를 생성하는 반복 가능한 객체를 생성하는 모든 반복 가능한 객체 (입술 [(1,2),'ab']이 유효 함)

  2. 반복시 객체가 산출하는 순서입니다. i첫 번째 수익률, j두 번째 수익률로 이동 합니다.

  3. 예,하지만 예쁘지는 않습니다. 기능적으로 다음과 동일하다고 생각합니다.

    l = 목록 ()
    i, j in object :
        l.append (함수 (i, j))
    

    또는 더 나은 지도 사용 :

    map(function, object)

    그러나 물론 기능은 얻을 것 i, j그 자체.

  4. 3 번과 같은 질문 아닌가요?


2

zip함수 를 사용하여 같은 줄에 두 개의 for 루프를 사용할 수 있습니다.

암호:

list1 = ['Abbas', 'Ali', 'Usman']
list2 = ['Kamran', 'Asgar', 'Hamza', 'Umer']
list3 = []
for i,j in zip(list1,list2):
    list3.append(i)
    list3.append(j)
print(list3)

산출:

['Abbas', 'Kamran', 'Ali', 'Asgar', 'Usman', 'Hamza']

따라서 zip 함수를 사용하여 두 개의 for 루프를 사용하거나 동일한 행에서 두 개의 목록을 반복 할 수 있습니다.


-1

두 개의 for 루프를 사용하는 동안 중첩 루프에 대한 최상의 예제는 아래 코드에서 첫 번째 루프의 출력이 두 번째 루프에 대한 입력임을 기억하십시오. 중첩 루프를 사용하는 동안 루프 종료도 중요합니다.

for x in range(1, 10, 1):
     for y in range(1,x):
             print y,
        print
OutPut :
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.