프로그래밍 언어발행일 2023. 2. 28.원본 https://blog.naver.com/jword_/223030902359 ↗

파이썬 실습예제 todo리스트 (2) - 검색 구현하기

파이썬 실습예제 todo리스트 (2) - 검색 구현하기 — #파이썬 #파이썬실습예제 #todo리스트 AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습...

#Languages#Naver Blog

#파이썬 #파이썬실습예제 #todo리스트

​

AI스쿨 msa기반 java 백엔드 코스 중에 공부한 내용을 작성하였습니다

이전글 print() 정답공개

글을 시작하기에 앞서 이전글에서 print() 관련 퀴즈를 내었습니다. 일정 수정 완료 후 아래와 같이 출력 print()되도록 만드는 것인데요.

name : study -> review desc : python date : 02.27

다양한 방법이 있겠지만 제가 구현한 코드는 아래와 같습니다. (이전글을 보고 와주세요)

for n, b, a in zip(command\_name, before\_todo, todos\[idx\]): if n == command\_name\[field\_idx\]: print(n, ':', b, '->', a) else: print(n, ':', b)​ break

n은 command\_name의 개별 요소로 반복문을 돌면서 'name', 'desc', 'date'값을 가지게 됩니다. mod 사용시 사용자의 입력값을 받아 field\_idx로 구현되어 index 번호를 받게됩니다.

​

이때만 print()에 '->' & a=todos\[idx\]가 출력되도록 구현시키면 자연스럽게 위와 같은 출력이 구현될 것 입니다.

​

거창하게 코드를 구현할 생각보다는, 있는 그대로 어떻게 구현할지에 대해 생각해보는 문제였습니다 :D

파이썬 todo리스트 - 검색기능 구현하기

이미지

이전글에 이어 todo리스트 구현을 진행합니다. 이번글은 todo리스트에 검색기능을 넣어보겠습니다. 구현 목표는 아래와 같습니다.

한글자만 검색해도 관련 일정이 전부 출력되도록 한다.검색필드를 지정하여 검색할 수 있게 구현한다.존재하지 않는 알파벳을 입력시에 문구가 뜨게한다.

예를들어 ('study', 'python', '02.26') 이라는 일정이 저장되어 있으면 사용자에게 field('name', 'desc', 'date')를 선택받은 후 's' 만 입력해도 사용자에게 해당 데이터를 볼 수 있게끔 합니다.

​

\*데이터는

name, desc, date

'study', 'python', '02.26'순으로 매칭되어 저장됨

(이전글 참고)

검색기능 - 필드선택

검색기능 - find

find를 사용하여 검색기능을 구현합니다. 사용자에게 검색할 명령어와 검색할 필드를 입력받습니다.

elif command == 'find': select\_field = input('검색할 필드를 입력하세요') search\_keyword = input('키워드 입력')

이후 사용자에게 입력받은 필드값을 활용하여 field\_idx를 구합니다.

elif command == 'find': select\_field = input('검색할 필드를 입력하세요') search\_keyword = input('키워드 입력') field\_idx = command\_name.index(select\_field)

여기까지는 mod와 크게 다르지 않습니다. 이번글의 핵심은 아래입니다. 잠시 구현된 기능을 정리해보겠습니다.

find기능을 구현하고, 사용자에게 검색할 키워드와 필드를 입력받음입력 받은 필드의 index(field\_idx)는 저장된 데이터의 인덱스와 같음

검색기능 - 키워드 찾기

이제 입력받은 키워드를 반복문 처리하여 키워드가 포함된 모든 데이터를 출력하도록 합니다.

for todo in todos: for value in todo\[field\_idx\]: if find\_value in value: print(todo)

todos를 반복문 돌리면 ('study', 'python', '02.26') 튜플데이터 todo가 됩니다. todo를 반복문 돌리면 어떻게 될까요? 'study', 'python', '02.26'데이터가 하나하나 나오게 될것입니다.

study에 포함된 한글자, 예를들어 s, u 등 만을 입력해도 study가 포함된 튜플데이터를 찾게하려면, todo를 반복문을 돌려 'study'안에서 찾아야합니다.

​

우리는 field\_idx를 미리 받아놨으니, 사용자가 입력한 필드에서만 데이터를 찾으면됩니다.

검색기능 - 존재하지 않는일정

사용자가 일정에 없는 알파벳을 입력했을때 '존재하지 않는 일정입니다'를 출력하도록 만들고 싶었습니다.

elif command == 'find': phrase = False select\_field = input('필드를 선택해주세요') find\_value = input('검색어를 입력하세요') field\_idx = command\_name.index(select\_field)​ for todo in todos: for value in todo\[field\_idx\]: if find\_value in value: print(todo) phrase = True break else: if phrase == False: print('일정이 존재하지 않습니다.')

이때는 이런식으로 사용이 가능합니다. phrase라는 변수 값을 False로 바꾼 후 검증된 순간에만 True로 값을 변경해주면됩니다.

break사용이 중요한이유

for todo in todos: for value in todo\[field\_idx\]: if find\_value in value: print(todo)* break** else: if* phrase == False: print('일정이 존재하지 않습니다.')

만약 위와 같이 break가 for문에 걸리게 된다면 어떻게 될까요? 이전글에서 배웠듯이 break는 가장 가까운 루프를 탈출합니다.

​

if문이 실행되지 않는다면 바로 루프를 탈출하기 때문에 else가 실행되지 않습니다. (else의 경우 break를 만나지 않는 for문에서 실행)

​

원하는 기능을 제대로 구현시키기 위해서는 이런 사소한 break도 사용하는데 주의해야합니다.

​

생각해보기

현재 todo 리스트는 리스트 형태로 구현되어 있습니다. 이 부분을 딕셔너리로 수정하려면 어떻게 코드를 고쳐야 할까요? 다음글에 다뤄보고자 하니 모두들 생각해 보셨으면 좋겠습니다. :D