파이썬 리스트 뒤에서부터 - paisseon liseuteu dwieseobuteo

파이썬 리스트 뒤에서부터 - paisseon liseuteu dwieseobuteo

    1 답변

    • 1. reversed 함수

      array=[0,10,20,40]
      for i in reversed(array):
          print i
      

      reversed()함수는 list가 아닌 list_reverseiterator를 return 합니다. 뒤집힌 listreturn하고 싶을 때는 list(reversed(array))로 써야 합니다.

      2. slicer

      L[::-1]가 L을 뒤집은 list [40, 20, 10, 0]를 return 한다는 성질을 이용하는 방법입니다.

      L = [0,10,20,40]
      for i in L[::-1]:
          print i
      

      • 조다호 50 points2016-01-19 15:45:22에 작성됨

    답변을 하려면 로그인이 필요합니다.

    Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

    (ಠ_ಠ)

    (ಠ‿ಠ)

    ᕕ( ᐛ )ᕗ 로그인이 필요합니다

    Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.

    Python의 가장 큰 매력 중 하나가 리스트 인덱싱과 슬라이싱(list slicing and slicing)입니다. 각괄호와 콜론을 이용해서 리스트의 원소나 리스트의 일부를 쉽게 취할 수 있지요. C나 Java에서 배열 인덱싱, 슬라이싱했던 것과 비교하면 가독성과 간결성 측면에서 비교가 되지 않습니다.

    인덱싱과 슬라이싱 외에도 Python의 리스트 연산(list operation)은 편리하기로 유명합니다. 여기에서는 음의 값(minus integer)을 이용한 리스트 인덱싱, 슬라이싱을 살펴 보겠습니다.

    우선 아래와 같이 실험용 리스트를 하나 만들어 보겠습니다. 0부터 9까지 10개의 정수로 채워진 리스트이죠. 리스트 속 각 인덱스 위치에는 인덱스와 동일한 정수 값이 들어 있는 형태입니다. a[i] = [i]인 형태 말이죠.

    a = list(range(10))
    print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    이 리스트의 인덱스로 음의 값을 주면 어떻게 될까요? C를 생각하면 a[0]의 주소값 이전의 메모리 영역을 가리키게 되겠죠. Python에서는 그렇지 않습니다. 음의 값인 -n으로 인덱싱을 하면 뒤에서 n번째 요소를 가리키는 셈이 됩니다.

    print(a[-1], a[-2]) # 9 8
    

    위를 보시면 a[-1]은 뒤에서 1번째 요소인 9를, a[-2]는 뒤에서 2번째 요소인 8을 가리키는 사실을 볼 수 있습니다. 이를 응용해 음의 값으로 슬라이싱을 할 수도 있습니다.

    print(a[-2:]) # [8, 9]
    print(a[:-2]) # [0, 1, 2, 3, 4, 5, 6, 7]
    print(a[-3:-1]) # [7, 8]
    

    위를 보건대, a[-2:]는 뒤에서 2번째 요소인 8부터 마지막 요소인 9까지를 슬라이싱하고 a[:-2]는 처음 요소부터 뒤에서 2번째 요소인 8까지 슬라이싱하되 8은 결과에 포함하지 않습니다. 원래 Python 리스트를 a[start:stop]과 같이 슬라이싱할 때 stop 위치에 해당하는 요소는 미포함(exclusive)하지요.

    리스트 슬라이싱의 stride에도 음의 값을 넣을 수 있습니다. a[start:stop:stride]와 같이 슬라이싱할 때, stride는 요소를 취하는 빈도를 나타냅니다. stride가 2라면 하나 건너 하나를 취하겠죠. 아래처럼 말이죠.

    print(a[::2]) # [0, 2, 4, 6, 8]
    

    stride를 음의 값으로 하면 리스트가 역방향으로 슬라이싱됩니다. 이를 이용해 리스트의 역순 정렬(reverse sorting)도 할 수 있습니다. 아래의 a[-1:-3:-1]을 같이 보실까요? 뒤에서 1번째 요소인 9부터 뒤에서 3번째 요소인 7까지 슬리이싱하되 7은 결과에 포함하지 않겠지요? 따라서 결과가 [9, 8]이 됩니다.

    print(a[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    print(a[-1:-3:-1]) # [9, 8]
    

    앱피아

    Python/Python 응용

    파이썬[Python] List 역순으로 만들기 (reversed,reverse)

    끔손 2020. 3. 9. 07:18

    오늘포스팅은뒤로돌아가는세상으로한번 꾸며보고자합니다. 다름아니라, List역순으로거꾸로뒤에서부터값을읽어오는형태로루프를돌리거나, 아니면 리스트를역순으로바꾸는방법에대해서알아보고자합니다.

    List 역순으로 읽어오는 루프

    물론흔치않지만, 종종데이터값들을리스트에저장하고 값을역으로루프를돌리는경우가있습니다. 그럴경우는저는다음과같은형태로코드를돌렸을 것입니다. 

    #Made by Appia Example 

    my_list = [1,2,3,4,5]

    for item in my_list[::-1]: #[::-1] 역으로 슬라이싱

    print(item)

    ""

    #Result :

    5

    4

    3

    2

    1

    """

    cs

    넘 코드가 없어 보이시나요? 하지만, 매우 쉬운 코드로 작성하는 것이 맞을 것 같아서 다음과 같이 작성해봤습니다. 여기에서 가장중요한 것은 [::-1]입니다. 

    List 역순으로 바꾸기

    물론 위와 같이 [::-1]를 모르는 경우도 있을 수 있습니다. 이럴 경우는 그냥 List 자체를 역으로 바꿔서 하는 방법도 있습니다. 그럼 그 방법에 대해서 살펴보도록 하겠습니다. 

    먼저 reverse() 함수를 이용해보도록 하겠습니다. 이 함수는 모든 List의 맴버를 거꾸로 만들어 줍니다. 하지만, 그 리스트 자체를 변경해 버립니다. 그럼 다음 예제를 살펴보겠습니다. 

    listValue = [1,2,3,4,5# list(range(5)로 생성 가능

    listValue.reverse()

    print(listValue)

    cs

    위의 부분은 1,2,3,4,5라는 각 맴버들을 가지는 listValue라는 List를 생성했습니다. 이를 reverse 함수를 통해서 다음과 같이 역으로 진행해봤습니다. 결과는 다음과 같이 나옵니다. 

    위의 부분을 바탕으로 다음과 같은 예제를 작성해봤습니다. 다음 예제는 실행을 할 수 있을 까요? 

    #Made by Appia for Example

    listValue = [1,2,3,4,5# list(range(5)로 생성 가능

    for value in listValue.reverse():

    print(value)

    cs

    대부분 위의 코드를 바탕으로 생각하셨을 것이라고 생각합니다. 저도 예전에는 다음과 같은 예제를 실행해봤습니다. 그럼 다음과 같은 에러 메시지가 납니다. 

    Traceback (most recent call last):

    File "C:/Users/Bens/PycharmProjects/Blogger/Makef.py", line 7in <module>

    for value in listValue.reverse():

    TypeError: 'NoneType' object is not iterable

    cs

     이 부분에 대해서 쉽게 생각하시기 위해선 다음과 같은 코드를 한번 실행해 보셔야 합니다. 

    listValue = [1,2,3,4,5# list(range(5)로 생성 가능

    print(type(listValue.reverse()))

    #결과 : <class 'NoneType'>;

    cs

    아무리 reverse 메소드가 리스트를 역순을 취해줘서 list로 보일 수 있을지 몰라도, reverse 메소드 자체의 반환 값이 없습니다. 따라서 루프를 돌릴 수 없습니다. 만약 루프를 돌리고 싶으시면 앞서서 reverse 작업을 하시고 나서 루프를 돌리시는 것을 추천합니다. 

    그럼 이번에는 다른 함수를 한번 이용해보겠습니다. 물론 reverse()함수와 유사한 reversed()함수 입니다. 몇 몇 분들은 말장난 하냐라고 따질 수 있지만, 살짝의 차이가 있으니, 양해 부탁드립니다. reversed()함수는 reverse()함수와 다르게 값을 반환하는 형태입니다. 그럼 다음 예제를 살펴보겠습니다. 

    listValue = [1,2,3,4,5# list(range(5)로 생성 가능

    new_listValue = reversed(listValue)

    print(new_listValue)

    print(list(new_listValue))

    cs

    생각했던 결과와 조금 다를 수 있습니다. 그럼 결과 부터 한번 보시겠습니다. 

    위의 결과 첫번째 줄은 new_listValue의 값으로 즉, reversed()의 결과 값입니다. 이 부분은 바로 거꾸로 된 값을 주는 것이 아니라, list(new_listValue)라는 같은 형태로 한단계 더 걸쳐서 list를 역으로 만들게 해주고 있습니다.

    그럼 이를 바탕으로 반복문을 사용해볼까요? 

    listValue = [1,2,3,4,5# list(range(5)로 생성 가능

    for value in reversed(listValue):

    print(value)

    cs

     위의 결과가 과연 될까요? 다음과 같은 결과가 나옵니다. 

    reversed()는 nontype이 아닙니다. iterator되기 위한 형태입니다. 따라서 위와 같은 형태로 나타낼 수 있습니다. 

    그럼 이제 성능적인 측면에서 이야기를 해보고자 합니다. 과연 reversed/reverse를 사용하는 것이 효율적인 것에 대해서는 한번 생각해봐야 합니다. 다음과 같은 예시를 한번 살펴보겠습니다. 

    import timeit

    myList = ['A''P''P''I','A']

    print(timeit.timeit("''.join(reversed(myList))"'from __main__ import myList'))

    print(timeit.timeit("''.join(myList[::-1])"'from __main__ import myList'))

    cs

    timeit 모듀을 통해서 실행 시간을 한번 검색해보겠습니다. 

    0.3328118

    0.23687349999999996

    cs

    즉 보시는 바와 같이 reversed()가 효율적인 방법은 아닙니다. 만약 갯수의 차이가 지금보다 훨씬 많아진다면 이 부분은 눈에 뛰는 차이를 나타낼수 있습니다. 

    오늘은 파이썬 list를 역순으로 만드는 방법에 대해서 한번 살펴봤습니다. 혹시 도움이 되셨다면 공감 버튼 클릭 부탁드립니다.