◎ Python/알게된 것 정리

[Python 정리] for문에서 이전 요소를 다음 요소에 덮어씌우는 방법?

Reo 2023. 6. 9. 18:35
반응형

코드를 짜다가 리스트에서 맨 뒤의 요소부터 바로 앞의 요소로 덮어씌워야 하는 일이 생겼다.

 

가장 먼저 생각할 수 있는 방법은 인덱싱을 이용하는 것이다.

# 간단하게 좌표라고 생각
class Pair:
    def __init__(self, x, y) -> None:
        self.x = x
        self.y = y

    def __repr__(self) -> str:
        return f"({self.x}, {self.y})"

# 좌표들을 저장할 리스트 생성
list_pair = []

# (0, 0), (1, 1) 등등 좌표 생성
for i in range(5, 0, -1):
    tmp = Pair(i, i)
    list_pair.append(tmp)

print(f"이전 : {list_pair}")

# 맨 뒤의 요소부터 그 앞의 요소로 덮어씌움
for i in range(len(list_pair) - 1, 0, -1):
    list_pair[i].x = list_pair[i - 1].x
    list_pair[i].y = list_pair[i - 1].y

print(f"이후 : {list_pair}")

>>>
이전 : [(5, 5), (4, 4), (3, 3), (2, 2), (1, 1)]
이후 : [(5, 5), (5, 5), (4, 4), (3, 3), (2, 2)]

당연하게 맨 뒤에서부터 시작해서 1이 2로, 2가 3으로, 3이 4로 바뀌면서 첫 번째 요소는 바뀌지 않았다.

 

 

그런데 이걸 인덱싱을 하지 않고 구현할 수 있는 방법이 있을까.. 굳이 필요한가 싶겠지만 zip을 이용해 구현해보았다.

어느 면에서는 인덱싱보다 나을 수도..?

# 간단하게 좌표라고 생각
class Pair:
    def __init__(self, x, y) -> None:
        self.x = x
        self.y = y

    def __repr__(self) -> str:
        return f"({self.x}, {self.y})"

# 좌표들을 저장할 리스트 생성
list_pair = []

# (0, 0), (1, 1) 등등 좌표 생성
for i in range(5, 0, -1):
    tmp = Pair(i, i)
    list_pair.append(tmp)

print(f"이전 : {list_pair}")

# 맨 뒤의 요소부터 그 앞의 요소로 덮어씌움
for cur, next in zip(list_pair[::-1], list_pair[-2::-1]):
    cur.x = next.x
    cur.y = next.y

print(f"이후 : {list_pair}")

>>>
이전 : [(5, 5), (4, 4), (3, 3), (2, 2), (1, 1)]
이후 : [(5, 5), (5, 5), (4, 4), (3, 3), (2, 2)]

이해만 한다면 알아보기는 더 쉬운 것 같다.

 

 

간단하게 핵심만 짚어 보자.

# 맨 뒤의 요소부터 그 앞의 요소로 덮어씌움
for cur, next in zip(list_pair[::-1], list_pair[-2::-1]):
    cur.x = next.x
    cur.y = next.y

zip 내장함수를 이용해 두 개의 리스트를 인수로 주었다. list_pair[::-1]은 리스트를 거꾸로 만드는 것이고, list_pair[-2::-1]은 뒤에서 2번째 값까지 자른 후, 즉 맨 뒤 요소를 자른 후 리스트를 거꾸로 만드는 것이다.

 

즉 아래와 같다.

list_pair[::-1] 은 [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]
list_pair[-2::-1] 은 [(2, 2), (3, 3), (4, 4), (5, 5)]
반응형