오늘 오전엔 어제 다 못한 스파르타피디아 삭제 알고리즘 수정을 진행했다.
방법을 생각해두고 자서 그런지 생각보다 해결책 구현이 빨리 되었다.
그래서 오늘의 TIL은 이번 문제를 해결하는 '문시해알'에 대해 적겠다.
해당 웹 사이트에서 각각의 카드에 해당 카드만 삭제하는 기능을 가진 버튼을 구현하는 test가 있었다.
웹개발 종합반에 배운 내용을 써먹어
num
을 키로 가진 value 숫자를 부여후 다른 정보들과 딕셔너리에 db에 저장db.test1.delete_one({'num': int(num_receive)})
방식으로 구현했었다. num 부여 방식은 아래 코드로 python에 구현했다.
test1_list = list(db.test1.find({}, {'_id': False})) # db에 있는걸 다 불러와 리스트를 만든다.
count = len(test1_list) + 1 # 해당 리스트의 길이에 1을 더해 num을 만든다.
하지만 이 방식을 활용하니 새 num을 부여할 때 카드의 갯수 + 1
로 저장되어 카드의 삭제와 생성을 반복하면 num이 겹치는 문제가 발생했다.
이 상태에서 디지몬 카드를 삭제하면 num이 겹치는 푸른하늘 카드가 같이 삭제되는 오류가 발생한다.
num을 부여하는 방식이 잘못되었다고 생각해서 방법을 고민해보았다.
db에 저장될 때 리스트 안의 딕셔너리 형태로 저장되어있어 변수 생성시 구분에 유의해야한다.
딕셔너리 리스트의 컬럼을 추출하여 리스트를 새로 만드는 방법을 검색해
db에서 불러온 리스트(딕셔너리로 저장되어 있는)를 가지고 key값으로 num
을 가진 value들을 모아 다시 리스트로 묶었다.
test = list((m['num'] for m in test1_list))
test 리스트에서 최대값을 찾는 python 함수는 max()
하지만 count = max(test) + 1
로 바로 저장 시 카드가 하나도 없으면 max(test)값이 비어
ValueError: max() arg is an empty sequence
오류가 떴다.
그래서 test의 길이가 0일때 count를 1로 고정하는 조건문을 추가로 달았다.
test1_list = list(db.test1.find({}, {'_id': False}))
test = list((m['num'] for m in test1_list))
if len(test) == 0:
count = 1
else: count = max(test) + 1
이렇게 하니 중복없고 간단하게 카드에 num을 부여할 수 있었다.
문제가 발생하면 일단 어디서 논리적으로 오류가 발생하는지부터 생각해야 한다.
해결방법은 몇가지가 되는데 기존 오류가 해결되고 추가적인 오류가 발생하지 않으면서 효율적인 코드를 찾는게 최우선이다.
파이썬은 익숙하지 않았는데 구글링은 신이다. 검색하면 다 나온다.