• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

Exercise 38 질문

20.12.16 19:20 작성 조회수 132

0

안녕하세요 강의 잘 듣고 있습니다.

Exercise 38에 관해 질문드립니다.


지시사항을 보고 제가 처음 구상한 코드는 주어진 리스트에서 음수인 멤버를 제거한 뒤 0 이상의 정수만 남은 리스트를 출력하는 것입니다.

이 구상에 따라 필요한 작업을 구분해보니 다음과 같습니다 :

1. 주어진 리스트의 복본을 생성함.

   - 음수 삭제 방식으로 하려니 원본을 조작하면 인덱스가 바뀌는 문제가 해결되지 않아 복본을 만드는 방법을 구상하였습니다.

2. for문으로 원본리스트의 인덱스를 순서대로 지나가도록 함.

2-1.  for문 안에서 if문으로 원본리스트의 각 멤버가 음수인지 판별함.

2-2. 복본리스트의 멤버가 음수이면 복본리스트에서 remove메소드로 제거함.

3. 최종으로, 음수가 제거된 복본리스트를 출력함.


위의 구상대로 코드를 만들면 지시된 내용대로 출력이 될 줄 알았습니다.

그러나 코드를 작성하고 실행해보니 에러가 발생하였고 구체적으로 살펴보니 다음의 세 가지 문제가 있어보입니다 :

문제 1. "복본리스트(num_list_dupl)=원본리스트(num_list)" 식으로 작성하면 복본리스트를 remove메소드 등으로 조작해도 원본리스트는 불변하리라고 생각하였지만 원본리스트도 같이 변경됨을 확인하였습니다.

문제 2. 위 문제 1과 연계되어, 원본리스트가 변경되는 바람에 원본리스트 멤버의 음수여부 판단하는 if조건문에서 3번째 인덱스의 멤버인 33이 그냥 지나쳐버리는 문제가 있습니다. 이는 원본리스트가 변경되면서 인덱스도 바뀌어 발생한 것으로 추측합니다.

문제 3. 인덱스 6에서 에러가 발생하였습니다. 이 역시 문제 2에서 발견한 바와 같이 원본리스트가 변경되면서 인덱스 6이 없어진 이유로 발생한 에러로 파악합니다.

결국 문제의 근원은 제가 복본리스트를 만든 코드에 있는듯 합니다.
어떻게 하면 원본리스트가 불변하도록 복본리스트를 만들 수 있는지 알고 싶습니다.

긴 질문 읽어주셔서 감사합니다.


아래는 제가 작성한 해당 코드입니다.


num_list = [0, -11, 31, 22, -11, 33, -44, -55]
num_list_dupl = num_list
print("원본 리스트의 멤버 수는", len(num_list))
print("원본 리스트의 복본 리스트 : ", num_list_dupl)
print("============================================\n")

for j in range(0,len(num_list)) :
    print("{}번째 반복문".format(j+1))
    print("{}번째 리스트멤버의 값은 {}".format(j+1, num_list[j]))
    if num_list[j] < 0 :
        print("{}는 음수이므로 복본 리스트에서 제거함.".format(num_list[j]))
        num_list_dupl.remove(num_list[j]) #복본 리스트에서 음수인 멤버 제거.
        print("음수 제거 후 복본 리스트 : ", num_list_dupl)
        print("원본 리스트 : ", num_list)
        
        print("============================================")
    else :
        print("{}는 0이상의 정수".format(num_list[j]))
        print("복본 리스트 : ", num_list_dupl)
        print("원본 리스트 : ", num_list)
        print("============================================")
       

답변 1

답변을 작성해보세요.

1

안녕하세요. 이 부분은 양해를 부탁드립니다.

영상 초반에 말씀드린대로, 강의 내용에 대한 문의만 부탁을 드려요. 영상과 새소식에서도 말씀을 드렸던 부분이라서요. 새소식도 한번 확인부탁드려요. 다시한번 이 부분 양해부탁드립니다.

간단히만 리스트 원본을 복사하려면 다음과 같이 copy() 를 쓰셔도 좋습니다.

bar = [1, 2, 3]

copy_list = bar.copy()