ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] for문에서 리스트를 사용할 때 주의해야하는 것
    내일배움캠프/Python 2024. 7. 19. 21:27

     

     

    for문에서 반복 가능한 객체의 요소 삭제

     

    for i in section:
        for j in section:
             if j in range(i,i+m)
                   section.remove(j)
                   cnt += 1 

     

    for문은 반복 가능한 객체의 요소를 할당해서 반복을 하게 되는데요,

    요소를 삭제하게 되면 원하는 결과가 나오지 않을 수도 있습니다.

     

    그 이유는 for문이 요소를 가져오는 방법에 의해 생기는 것입니다.

     

    반복 가능한 객체 section에서 직접 요소를 가져오는 방식인

    for i in section이든

    반복 가능한 객체 section에 인덱스 번호를 할당하여 불러오는 방식인

    for i in range(len(section))이든

    for문은 해당 반복 가능한 객체에서의 앞에서 순서를 매겨서 가져오기 때문입니다.

     

     

    예를 들어

     

    section = [1,2,3,4,5]라고 할 때

    for문이 요소를 가져오는 방식은

    section의 첫 번째 요소, 두 번째 요소... 세 번째 요소..

    이렇게 읽어옵니다.

     

    따라서 만약 for문이 한 번 돌아서

    section의 1을 삭제한다면

     

    section은 [2,3,4,5]가 되고

     

    그 다음으로 가져오는 요소는

    2가 아닌 3이 되게 되는 것입니다.

     

    1을 삭제했기 때문에

    section의 두번 째 요소는

    2가 아닌 3이 되기 때문입니다.

     

    따라서 for문을 사용할 때

    반복 가능한 객체의

    삭제를 조심해야 합니다..

     

     

     

    for문에서 순서뒤집기

     

    def solution(my_string, queries):
        my_string = list(my_string)
        for i, j in queries:
            my_string[i:j+1] = my_string[i:j+1][::-1]
        return ''.join(my_string)

     

    위의 코드는 my_string의 i부터 j 인덱스까지의 순서를 뒤집는 것입니다.

    다시말해 j부터 먼저 나오고 뒤이어 i가 나오게 거꾸로 읽는 것입니다.

     

    반복 가능한 객체에서 거꾸로 읽는 방법은

    [i:j][::-1]과 [j:i-1:-1]이 있는데요,

    후자의 방식을 조심해야 합니다.

     

    왜냐하면 i-1이 0보다 작아질 수 있기 때문입니다.

    그렇다면 의도한 결과와 달라질 수 있습니다.

     

     

    복사본 만들기

     

    def solution(arr):
        cnt = 0
        result = []

        while result != arr:
            result = arr[:]
            for i in range(len(arr)):
                if arr[i]%2==0 and arr[i]>=50:
                    arr[i] = arr[i] // 2
                elif arr[i]%2==1 and arr[i]<50:
                    arr[i] = (arr[i]*2) + 1
            cnt += 1

     

    반복문을 돌고나서

    기존의 arr값을 result에 저장하고 싶을 때

    result = arr를 하면 원하지 않는 결과가 나올 수 있습니다.

     

    왜냐하면 반복문을 돌고난 arr의 값이

    result에 바로 반영되기 때문입니다.

     

    따라서 이 때는 arr을 복사한 값을 result에 저장해줘야 합니다.

    arr을 복사하는 방법은

    정말 간단합니다.

     

    arr의 모든 원소를 슬라이싱하는

    arr[:]를 사용해주면 됩니다.

     

    이 방법을 이용하면

    반복문을 돌기 전의 값과 반복문을 돌고난 후의 값 비교할 수 있게 됩니다!

Designed by Tistory.