loading
본문 바로가기
파이썬 테스트 [Python]

파이썬 이차원 리스트 문제 (feat. reverse, reversed의 차이)

by GSTGTS 2022. 1. 20.

파이썬 이차원 리스트 문제 (feat. reverse, reversed의 차이)

초보자를 위한 파이썬 300제 문제 풀이입니다. 문제를 푸실  분들은 아래 링크에서 문제 먼저 푸시기 바랍니다.

https://wikidocs.net/78564

 

181 ~ 190

.answer {margin-top: 10px;margin-bottom: 50px;padding-top: 10px;border-top: 3px solid LightGray ...

wikidocs.net

 

 

이차원 리스트를 뒤에서부터 순서대로 출력하는 문제. 문제를 풀면서 reverse와 reversed의 차이도 확인하고 가자.

우선 문제는 아래와 같다.

# 186
# 리스트에 저장된 데이터를 아래와 같이 출력하라.

# apart = [ [101, 102], [201, 202], [301, 302] ]
# 301 호
# 302 호
# 201 호
# 202 호
# 101 호
# 102 호

 

 

리스트 안에 리스트로 묶인 원소들이 들어가 있는 형태를 이차원 리스트라고 한다. 일단 리스트를 두번 돌려야 그 안의 원소를 하나씩 출력할 수 있다. 다중 반복문의 형태로 for문 안에 for문이 있는 형태만 될 것 같다. 그래서 내가 생각한 풀이는 reverse()를 생각하는 풀이였다. 그래서 처음 작성한 코드는,

apart = [ [101, 102], [201, 202], [301, 302] ]
for row in apart.reverse():
    for col in row:
        print(col, "호")
        
>>> TypeError: 'NoneType' object is not iterable

 

 

TypeError: 'NoneType' object is not iterable

 

이렇게 에러가 뜬다. 그래서 다시 생각한 방법은,

apart = [ [101, 102], [201, 202], [301, 302] ]
apart.reverse()
for row in apart:
    for col in row:
        print(col, "호")
        
>>> 301 호
>>> 302 호
>>> 201 호
>>> 202 호
>>> 101 호
>>> 102 호

이렇게 for문 밖에서 메소드를 쓰고 for문을 돌리면 된다. 왜 이럴까???

 

 

reverse()는 리스트의 값을 뒤집어 주지만 값을 반환하지 않고, reversed()는 리스트이 값을 뒤집으면서 값을 반환한다. 그래서 아래와 같이 for문에 reversed()를 쓰면 정상적으로 출력된다. 더 깊은 내용은 구글링해보면 된다.

apart = [ [101, 102], [201, 202], [301, 302] ]
for row in reversed(apart):
    for col in row:
        print(col, "호")
        
>>> 301 호
>>> 302 호
>>> 201 호
>>> 202 호
>>> 101 호
>>> 102 호

 

 

reverse()와 같은 리스트 메소드는 sort(reverse=True)를 사용하면 된다. sort()가 리스트 안의 원소를 정렬하는 건데, 이것을 거꾸로 정렬한다고 보면 된다.

apart = [ [101, 102], [201, 202], [301, 302] ]
apart.sort(reverse=True)
for row in apart:
    for col in row:
        print(col, "호")

>>> 301 호
>>> 302 호
>>> 201 호
>>> 202 호
>>> 101 호
>>> 102 호

 

 

답지는 아래와 같이 리스트 슬라이싱을 써서 풀었다. 슬라이싱은 [start : end : step] 순인데, step을 -1을 줘서 뒤에서부터 나오게했다. 코드가 짧고 직관적이니, 이게 가장 정답이 아닐까 싶다.

for row in apart[::-1]:
    for col in row:
        print(col, "호")

>>> 302 호
>>> 301 호
>>> 202 호
>>> 201 호
>>> 102 호
>>> 101 호

 

 

한 문제에도 여러가지 풀이가 나오는 재미가 있다. 다시 공부하러.

반응형

댓글