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