파이썬 초보 리스트 - remove 질문있습니다 삐약 🐥🐤🐣

조회수 1256회

리스트 안의 공통된 숫자를 제거하려고 하는 상황에서


a = [1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7]

for remove_one in a:

    a.remove(1)

print(a)
[2, 3, 4, 5, 6, 7]

여기는 1이 다 제거되는데


a = [1, 2, 1, 1, 1, 1, 1, 1, 1, 1]

for remove_one in a:

    a.remove(1)

print(a)
[2, 1, 1, 1, 1]

요기선 왜 뒤의 1 몇개가 남아있는걸까요?

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기
    1. list 에서 remove(value)를 수행하면 value가 여러개 있을 경우, 제일 앞에 있는 value만 삭제 됩니다.

    2. for 문은 list에서 순차적으로 각 원소를 변수에 대입합니다.

    3. for문 은 list의 마지막 원소를 대입한 후 종료합니다.


    그런데 위 예시는 정말 실로 절묘한 트릭이군요.. ㅎㅎ list 에 대한 좋은 공부 소재가 될 것 같습니다.

    1번 예제

    a = [1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7]
    for remove_one in a:
        a.remove(1)
    

    위 코드에서 remove_one 에는 (마치, for 1 in a: 같이 보이지만)

    1. list a의 각 값이
    2. 각 원소의 위치가 증가하면서
    3. 대입되게 됩니다.

    처음에는 1이 대입되겠죠.

    그 1은 remove로 제거 됩니다, list a 에서요

    그럼 그 다음 원소(2번째)가 remove_one 에 대입될텐데

    첫 번째로 있던 1이 없어 졌으니

    두번째 수행 당시에는 a가

    [2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7] 이런 식이 될겁니다.

    remove_one 에는 두번째 원소인 1이 들어가게 됩니다.

    remove(1) 명령이 수행되면

    남아 있는 1 중에서 맨 앞의 1이 또 삭제 되고

    a는 [2, 3, 1, 4, 1, 5, 1, 6, 1, 7] 이 됩니다.

    (remove_one 에는 세번째 원소인 1이 들어가게 됩니다)

    이런 식으로 반복되면

    뭐, 어쨌거나 list 끝까지 도니까 remove(1)이 계속 수행되어서

    결국 a = [2, 3, 4, 5, 6, 7]

    이렇게 되지요.

    ※ a 의 길이는 원래 12였는데, 6으로 줄었습니다. 기억하십시오.


    그런데 아래 코드는 또 다릅니다.

    2번 예제

    a = [1, 2, 1, 1, 1, 1, 1, 1, 1, 1]
    for remove_one in a:
        a.remove(1)
    

    위에서 설명 드린 바와 같이 동작할텐데

    이번엔 a의 길이가 10 이고, 1 갯수가 9개 입니다.

    원래 의도대로 라면 10번 돌아야겠지만

    remove 명령에 의해서 a 길이가 자꾸 줄어듭니다.

    처음 : [1, 2, 1, 1, 1, 1, 1, 1, 1, 1]

    1번째 for문 수행 후 : [2, 1, 1, 1, 1, 1, 1, 1, 1]

    2번째 for문 수행 후 :[2, 1, 1, 1, 1, 1, 1, 1]

    3번째 for문 수행 후 : [2, 1, 1, 1, 1, 1, 1]

    4번째 for문 수행 후 : [2, 1, 1, 1, 1, 1]

    5번째 for문 수행 후 : [2, 1, 1, 1, 1]

    자, 6번째 remove를 수행할까요? 아니죠. for문은 중단됩니다.

    현재, 리스트 a의 크기는 5인데 다음 원소를 가져올 수 없으니까요.

    그래서 remove도 5번 수행 후 중단된 것입니다.


    약간 미진한듯하여 ...

    list 에서 원하는 값들을 모두 제거하기 위한 코드를 추가합니다.

    참고하세요 ^

    # BMW 를 모두 제거할겁니다. 그냥 for 문 돌리면 위 2번 예시 같은 오류가 발생합니다.
    carList = ['BMW', 'BENZ', 'BMW', 'BMW', 'BMW', 'BMW', 'BMW', 'BMW', 'AUDI', 'BMW', 'BMW']
    
    # 오류
    # for car in carList:
    #     if car == 'BMW':
    #         carList.remove(car)
    # print(carList)
    # ['BENZ', 'BMW', 'BMW', 'AUDI', 'BMW', 'BMW']
    
    # 정상
    count = carList.count('BMW')
    for _ in range(count):
        carList.remove('BMW')
    print(carList)
    # ['BENZ', 'AUDI']
    
    • 오왕 구체적인 작동 방식을 알아둬야겠군요..! 😮😮😮 유병근 2021.8.10 01:58
    • 이렇게 구체적으로 알려주셔서 감사드립니다! 도움이 많이 됐어요! 😍 유병근 2021.8.10 01:58
    • 자, 6번째 remove를 수행할까요? 아니죠. for문은 중단됩니다. 현재, 리스트 a의 크기는 5인데 다음 원소를 가져올 수 없으니까요. 그래서 remove도 5번 수행 후 중단된 것입니다. //// 여기서 리스트 a의 크기가 5 일때, 왜 다음 원소를 가져올 수 없는건가욤?🤔 유병근 2021.8.10 03:36
    • for문에서 list 에서 원소를 꺼낼 때 point 가 증가하면서 해당 원소를 선택하게 되는데요, point가 5에서 6으로 증가했는데... 막상 list 길이가 5 밖에 안되서 (remove로 인해 크기가 줄어들었습니다) 더이상 꺼낼 원소가 없기 때문입니다 ^^ whistler7899 2021.8.10 07:30
    • 결과를 예상해보세요.. ^^
          carList = ['BMW', 'BENZ']
          for car in carList:
              print(car)
              carList.remove(car)
      whistler7899 2021.8.10 07:38
    • 아하~! 추가적인 답변 감사드려요 !_!❣ 유병근 2021.8.10 13:13

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)