• 2020. 6. 15.

    by. 윈썸지니

    반응형

    출처 : pixabay

    이번 포스팅에서는 리스트 연산하는 방법을 알아봅니다.

    리스트도 연산을 할 수 있습니다.

     

    리스트 더하기 ( + )

    리스트를 합치는 기능을 합니다.

    >>> x = [1,3,5]
    >>> y = [2,4,6]

    ## 리스트를 더합니다.
    >>> x + y
    [1, 3, 5, 2, 4, 6]
    >>> x
    [1, 3, 5]
    >>> y
    [2, 4, 6]

    ## 자기 자신에게 더합니다.
    >>> x += [ 10, 11]
    >>> x
    [1, 3, 5, 10, 11]

    ## 중첩 리스트도 같은 방식으로 더하기 할 수 있습니다.
    >>> x = [ [1,3] ]
    >>> y = [ 2, [4, 6]]
    >>> x + y
    [[1, 3], 2, [4, 6]]
    >>> 

     

    호기심이 발동하여 빼기도 되나? 싶어서 해 보았습니다.

    List 에서는 지원 하지 않는 다는 오류 메시지가 발생합니다.

    이전 포스팅의 삭제 방법으로 해야 합니다.

    >>> x = [1, 3, 5]
    >>> y = [ 2, 4, 6]
    >>> x - y
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        x - y
    TypeError: unsupported operand type(s) for -: 'list' and 'list'
    >>> x = [ 1, 3, 5]
    >>> y = [1, 3]
    >>> x - y
    Traceback (most recent call last):
      File "<pyshell#8>", line 1, in <module>
        x - y
    TypeError: unsupported operand type(s) for -: 'list' and 'list'
    >>> x -= [4, 6]
    Traceback (most recent call last):
      File "<pyshell#9>", line 1, in <module>
        x -= [4, 6]
    TypeError: unsupported operand type(s) for -=: 'list' and 'list'
    >>> 

     

    리스트 반복  ( * )

     

    곱하기 기호를 사용하여 리스트를 반복 시킬 수 있습니다.

    아래와 같이  곱하기 수 만큼 리스트를 반복 시킬 수 있습니다.

    >>> x = [1, 3] * 3
    >>> x
    [1, 3, 1, 3, 1, 3]

    중첩 리스트도 반복할 수 있습니다.

    >>> x = [[1,3]] * 3
    >>> x
    [[1, 3], [1, 3], [1, 3]]
    >>> x[0]
    [1, 3]

     

    여기서 중요한 개념이 하나 있습니다.

    위의 리스트의 첫번째 요소에 하나의 원소 값(7)을 추가하고 싶을 경우 아래와 합니다.

    결과가  [[1, 3, 7], [1, 3], [1, 3]] 이렇게 되기를 예상하고 아래 명령어를 수행합니다.

    그런데 각 요소에 7이 모두 추가 되는 결과를 얻었습니다.

    >>> x[0].append(7)
    >>> x
    [[1, 3, 7], [1, 3, 7], [1, 3, 7]]
    >>> x[1]
    [1, 3, 7]
    >>> x[1].append( 5)
    >>> x
    [[1, 3, 7, 5], [1, 3, 7, 5], [1, 3, 7, 5]]

     

    그럼 아예 리스트를  [[1, 3], [1, 3], [1, 3]] 로 정의하고 첫번째 요소에 7을 추가해 봅니다.

    처음에 예상했던 결과가 나왔습니다.

    >>> x =>>> x[0].append(7)
    >>> x
    [[1, 3, 7], [1, 3], [1, 3]]

     

    다른 점은 하나는 곱하기로 반복을 했고, 다른 하나는 리스트 선언시에 같은 리스트를 만들었습니다.

    왜 이런 결과가 나올까요?

    이전에 공부했던 id() 함수를 이용하여 주소 값을 출력해 보았습니다.

    원리는 아래 그림과 같습니다.

    곱하기를 할 경우 각 요소마다 같은 주소이지만 리스트를 선언할 경우는 각 요소마다 다른 주소 값으로 보여집니다.

    따라서 x[0] 으로 접근을 하지만 실제 파이썬은 주소로 접근을 하므로 결과 값이 아래 예제와 같이 달라집니다.

    아래 예제를 보면서 이해 해 보세요.

    >>> x = [[1,3]]
    >>> id(x[0])
    1298173072768
    >>> x *= 3
    >>> x
    [[1, 3], [1, 3], [1, 3]]
    >>> id(x[0] )
    1298173072768
    >>> id(x[1])
    1298173072768
    >>> id(x[2])
    1298173072768
    >>> 
    >>> x[0].append(5)
    >>> x
    [[1, 3, 5], [1, 3, 5], [1, 3, 5]]
    >>> id(x[0])
    1298173072768
    >>> id(x)
    1298173073024
    >>> id(x[1])
    1298173072768
    >>> x = [[1,3],[1,3],[1,3]]
    >>> id(x)
    1298173074368
    >>> id(x[0])
    1298173072448
    >>> id(x[1])
    1298172794112
    >>> id(x[2])
    1298172635648
    >>> x[0].append(5)
    >>> x
    [[1, 3, 5], [1, 3], [1, 3]]
    >>> 

     

    오늘은 약간 어려운 개념이 있었습니다. 하지만 원리를 이해하면 쉬운 개념입니다.

    이렇게 리스트를 연산하는 법을 공부하였습니다.

     

    다음 포스팅은 리스트 정렬 메소드에 대한 포스팅 입니다.

    반응형