ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리스트 컴프리헨션/2차원 배열 초기화
    ProgrammingLanguage/Python 2020. 9. 19. 22:30

    파이썬은 컴프리헨션(Comprehension)을 이용하여 반복 되거나 특정 조건을 만족하는 리스트를 쉽게 만들어낼 수 있다.

    이것을 리스트 컴프리헨션(List Comprehension)이라고 한다. 이 외에도 딕셔너리 컴프리헨션, 셋 컴프리헨션이 있으니 참고하도록 하자. 리스트 컴프리헨션은 특히 파이썬에서 다차원 리스트를 초기화 하는 경우 유용하게 사용되므로 익숙해지도록 하자.

     

    예를 들어, 0부터 9까지의 수를 1차원 리스트에 담고 싶은경우 일반적으로 다음과 같은 방법을 생각할 수 있다.

    arr = [0] * 10
    for i in range(10):
    	arr[i] = i

    하지만 컴프리헨션을 이용한다면, 다음과 같이 한 줄의 코드 만으로 1차원 리스트를 초기화 할 수 있다.

    arr = [i for i in range(10)]

     

    이와 같이 리스트 컴프리헨션은 앞에 반복을 원하는 대상을 두고, 뒤의 for 문을 조작해 줌으로써 원하는 동작을 하도록 만들 수 있다. 다른 예시로 0부터 9까지의 수를 반복하여 출력하고 싶다면, 다음과 같이 작성해볼 수 있다.

    [print(i) for i in range(10)]

     

    여기서 더 나아가 반복되는 대상에 조건을 달아주고 싶다면, for문 뒤에 조건문을 붙여주면 된다. 예를 들어 0부터 9까지의 숫자 중 짝수만을 출력하고 싶다면 다음과 같은 코드를 작성할 수 있다.

    [print(i) for i in range(10) if i % 2 == 0]

    만일 2중 for문을 이용하여 반복하고 싶다면, 뒤에 for문을 더 붙여주기만 하면 된다. 다음과 같은 코드를 작성해보고 결과를 출력해보자.

    [i + j for i in range(3) for j in range(3)]

     

    ▶2차원 리스트 초기화

    파이썬에서 2차원 리스트를 초기화 해주고 싶은 경우, 반드시 리스트 컴프리헨션을 이용해 주어야 한다.

    예를 들어 다음과 같이 2차원 리스트를 초기화 한다면, 내부에 있는 리스트가 모두 같은 대상을 참조하기 때문에 리스트 내부의 값을 변경하는 경우 문제가 발생한다. 아래와 같이 코드를 작성해보고, 결과를 출력해보자.

    arr = [[0] * 5] * 5
    arr[0][0] = 5

    이 문제에 대해 더 자세히 알고 싶다면, 얕은 복사와 깊은 복사의 개념에 대해서 공부하도록 하자.

     

    이러한 문제가 있기 때문에, 파이썬에서 2차원 리스트를 초기화 하는 경우 리스트 컴프리헨션을 이용한다. 일반적으로 코딩 문제를 풀 때 행렬을 표현하기 위하여 2차원 리스트를 활용하는 경우가 많은데, 여기서는 예를 들어 3x4행렬을 만든다고 가정하면 다음과 같은 코드를 작성할 수 있다.

    arr = [[0 for col in range(4)] for row in range(3)]

    마찬가지로 arr[0][0]에 아무 값이나 대입해보면, 원하는 인덱스의 값만 바뀌는 것을 확인할 수 있다.

     

    이처럼 컴프리헨션은 파이썬이 다른 언어에 비하여 코드를 간결하게 만들 수 있는 강력한 무기 중 하나이므로, 반드시 익숙해지도록 하자.

    'ProgrammingLanguage > Python' 카테고리의 다른 글

    시간 복잡도 측정  (1) 2020.09.20
    딕셔너리(dictionary) 자료형  (0) 2020.09.19
    e 혹은 E를 이용한 지수 표현  (0) 2020.09.19

    댓글

Designed by Tistory.