일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- pandas
- VBA
- 파워포인트
- git
- 문자열
- 비주얼베이직
- Outlook
- 안드로이드
- office
- Android
- Excel
- 윈도우10
- 오피스
- 깃
- Windows11
- Windows10
- python3
- python
- matlab
- 파이썬GUI
- 엑셀
- pyqt5
- 윈도우11
- pythongui
- 파이썬
- 아웃룩
- 파이썬3
- windows
- html
- win32com
Appia의 IT세상
파이썬[Python] List 역순으로 만들기 (reversed,reverse) 본문
오늘 포스팅은 뒤로 돌아가는 세상으로 한번 꾸며 보고자 합니다. 다름 아니라, 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 함수를 통해서 다음과 같이 역으로 진행해봤습니다. 결과는 다음과 같이 나옵니다.
[5, 4, 3, 2, 1] | 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 7, in <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> [5, 4, 3, 2, 1] | 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를 역순으로 만드는 방법에 대해서 한번 살펴봤습니다. 혹시 도움이 되셨다면 공감 버튼 클릭 부탁드립니다.
'Python > Python 응용' 카테고리의 다른 글
파이썬[Python] 단어들의 사용빈도 확인하기 (3) | 2020.03.10 |
---|---|
파이썬[Python] Dictionary(딕셔너리) 데이터 출력하기 (2) | 2020.03.09 |
파이썬[Python] 051 문자열 나누기 split() (1) | 2020.02.28 |
파이썬[Python] 050 리스트 맴버 섞기(Shuffle), 리스트 맴버 총합 구하기 (0) | 2020.02.27 |
파이썬[Python] 049 리스트에서 맴버 정렬하기(sort,sorted) (0) | 2020.02.26 |