Appia의 IT세상

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

Python/Python 응용

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

Appia 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 함수를 통해서 다음과 같이 역으로 진행해봤습니다. 결과는 다음과 같이 나옵니다. 

[54321]
cs

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

#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

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

<list_reverseiterator object at 0x0000029BE0A4F4F0> 
 
[54321]
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

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

5
 
4
 
3
 
2
 
1
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를 역순으로 만드는 방법에 대해서 한번 살펴봤습니다. 혹시 도움이 되셨다면 공감 버튼 클릭 부탁드립니다. 

반응형
Comments