파이썬 리스트 인덱싱관련 질문입니다
조회수 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로 지우시면 해결되실 것 같습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력