파이선에서 list를 뒤집는 연산은 꽤 많이 쓰입니다. 어떻게 뒤집는지 알아봅시다.

 


 먼저 [::-1]입니다. 이것은, 리스트를 역순으로 뒤집습니다. 실행 결과는 아래와 같습니다.

 

 

 yrotselpam 메이플 스토리가 뒤집어진 모양입니다. 이는 step이 -1이였기 때문입니다. -1은, 역순으로 1칸씩 이동한다는 의미입니다. -2를 하면 어떨까요? 역순으로 2칸씩 이동할까요? 직접 입력해 보겠습니다.

 

 

 li[::-2]를 입력해 보았습니다.

 

 

 그러면 yosla가 출력됨을 알 수 있는데요. y로부터 역순으로 2칸 가면 o가 나오고, o에서 2칸 역순으로 가면 s가 나옵니다. s에서 2칸 왼쪽으로 가면 l이 나오고, 또 거기서 왼쪽으로 2칸 가면 a가 나옵니다. 즉, -2는 왼쪽으로 2칸씩 이동한다는 의미입니다. 저는 백준에서 문자열이나 list를 뒤집을 일이 있을 때, 뒤집을 리스트[::-1] 이렇게 많이 씁니다.

 

 slicing은 생각보다 많이 쓰이니, 다음에 알아보도록 합시다.

 


그런데, 다른 방법도 있습니다.

 

 

 reversed(li)의 결과를 join에 넣습니다. 그랬더니, 메이플스토리가 거꾸로 출력됩니다. 왜 이렇게 될까요? 천천히 봅시다.

 

 

 먼저, reversed를 보면, sequence를 넣을 수 있습니다. 그러면, reverse iterator를 리턴하는데요. 역순으로 순회하는 이터레이터를 리턴합니다. 이 결과물을 join에 넣는데요.

 

 

 reversed에서 리턴된 iterator는 iterable합니다. 따라서, ''.join(reversed(li))를 하게 되면, ''.join(['y','r',...])을 호출한 결과와 같게 됩니다. 결론은 maplestory가 역순으로 나오게 됩니다.

 

 

 잘 나오는 군요. 그런데, 이 방법은 문자열일 때 가능한 방법입니다. 만약에 li가 [1, 2, 3, 4, 5]라면 이 방법을 쓸 수 없습니다.

 

 


 list 생성자에는, 아무런 인자가 없을 수도 있고, iterable 한 게 들어올 수도 있습니다. reversed(li)는 역순으로 순회하는 이터레이터이므로, 순회 가능한 것입니다. 따라서, list의 argument로 넣을 수 있습니다.

 

 

 요렇게 넣어 봅시다. 그리고, li2를 출력해 봅시다.

 

 

 그러면 놀랍게도, [1, 2, 3, 4, 5]가 거꾸로 나왔음을 알 수 있습니다.