리스트 컴프리헨션의 다중 루프

  • 리스트 컴프리헨션의 다중 루프 예제
matrix = [[1, 2, 3], [4, 5, 6]]
flat = [x for row in matrix for x in row]
print(flat)

>>>
[1, 2, 3, 4, 5, 6]
  • 위의 예제와 동치인 일반 루프문
matrix = [[1, 2, 3], [4, 5, 6]]
flat = []
for row in matrix:
    for x in row:
        flat.append(x)
  • 입력 리스트 레이아웃을 두 레벨로 중복하여 구성
matrix = [[1, 2, 3], [4, 5, 6]]
squared = [[x**2 for x in row] for row in matrix]
print(squared)

>>>
[[1, 4, 9], [16, 25, 36]]

여러 줄 짜리 리스트 컴프리헨션

  • 여러 줄의 리스트 컴프리헨션 예제
my_lists = [
    [[1, 2, 3], [4, 5, 6]],
    # ...
]
flat = [x for sublist1 in my_lists
        for sublist2 in sublist1
        for x in sublist2]
  • 위의 예제와 동치인 일반 루프문
flat = []
for sublist1 in my_lists:
    for sublist2 in sublist1:
        flat.extend(sublist2)

다중 if 조건문 포함

  • 예제
a = [1, 2, 3, 4, 5, 6]
b = [x for x in a if x > 4 if x % 2 == 0]
c = [x for x in a if x > 4 and x % 2 == 0]
  • 좀 더 복잡한 예제
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
filtered = [[x for x in row if x % 3 == 0]
            for row in matrix if sum(row) >= 10]
print(filtered)

>>>
[[6], [9]]
  • 위의 예제는 매우 복잡함
  • 이런 식의 복잡한 리스트 컴프리헨션은 피하는 것이 좋음
    • 가독성 문제
    • 조건 두 개, 로프 두 개, 혹은 조건 한 개 + 루프 한 개 정도가 적당함
    • 더 복잡해지면 헬퍼 함수 활용 (WAY 16. 리스트를 반환하는 대신 제너레이터를 고려하자)

Go back to the List of Studies