파이썬 리스트 인덱싱관련 질문입니다

조회수 2075회
class namecard:
    def __init__(self, name, email, addr):
        self.name = name
        self.email = email
        self.addr = addr

    def printinfo(self):
        print("="*30)
        print("Name: "+self.name)
        print("Email: "+self.email)
        print("Address: "+self.addr)

        print("=" * 30)


list = []

def run():

    print('')
    print("name: ")
    name = input()
    print("email: ")
    email = input()
    print("arrd: ")
    addr = input()

    list.append(namecard(name, email, addr))
    print('')
    print('')
    print('')


while True:
    print("="*30)
    print("1. 명함 추가")
    print("2. 명함 목록")
    print("3. 명함 지우기")
    print("4. Exit")

    print("=" * 30)

    print("Select: ")

    select = int(input())
    if select == 1:
        run()
    elif select == 2:
        for i in range(len(list)):
            list[i].printinfo()
            print('')
            print('')

    elif select == 3:
        print("누구의 명함을 지울까요?: ")
        removename = input()

        for i in range(len(list)):
            if removename == list[i-1].name:
                del list[i-1]
    elif select == 4:
        break
    else:
        continue



명함을 추가하고 보고 지울 수 있는 프로그램을 만들고있는데요 리스트에 클래스가 추가가 되고 목록을 볼 때에는

for i in range(len(list)):
            list[i].printinfo()

이런 인덱스로 접근이 가능한데요 (그리고 제 직관으로도 맞아보이고요)

그런데 명함을 지울때에는 여러번 시도하다가 찾아냈는데

for i in range(len(list)):
    if removename == list[i-1].name:

이렇게 i-1을 해줘야 하더라고요.. 같은 방식으로 접근하는건데 지울때는 왜 i-1로 접근이 가능한가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 리스트 접근은 i로 하시는게 맞습니다. 위 코드대로 하시면, 리스트 마지막 값은 접근하지 못해 삭제할 수 없는 버그가 있습니다.

    i-1를 i로 바뀌시면 안돌아가는게 아마 list index out of range 에러가 나오기 때문인 것 같습니다. del로 리스트값을 하나 지우는 순간 리스트값 갯수가 줄어들기 때문에 마지막 루프문에서 참조할 리스트값이 없어지기 때문입니다.

    i-1을 i로 고치신 뒤, del문 뒤에 braek를 추가하시던가, 루프문 안에서는 지워야할 리스트값 번호만 찾으신 뒤 루프문 밖에서 del로 지우시면 해결되실 것 같습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

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

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

(ಠ_ಠ)
(ಠ‿ಠ)