01/05 개인과제 문제 풀이 과정
어제 저녁부터 종일 문제풀이만 하는 중.
문제 1.
# 재고 데이터 예시
inventory_data = [
['Apple', 30],
['Banana', 20],
['Orange', 50]
]
#코드 예시
#기준치 20으로 판별하기
def check_inventory(a, b):
overstockings_table = []
shortcomings_table = []
for fruit in a:
name = fruit[0]
stock = fruit[1]
if stock <= b:
shortcomings_table.append({'name' : name, 'stock' : 'short'})
else :
overstockings_table.append({'name' : name, 'stock' : 'over'})
print('over: ',overstockings_table)
print('short: ', shortcomings_table)
check_inventory(inventory_data, 20)
문제2
문제의 관건
#1.문자열인가
#2.@가 있는가 1번 2번 @로 통합 가능? => @가 없으면 모두 무효(문
#3.@가 하나인가 #@@나란히 오면 '@@'사이를 공백으로 분리함 -> len()매서드로 집계 가능!
#4.@앞에 문자가 하나 이상인가
#5.@뒤에 도메인명이 있는가('.' 포함한 하나 이상의 문자) : try if 스플릿
오답
email_list = [
"example@example.com",
"wrongemail@.com",
"anotherexample.com",
"correct@email.co.uk"
]
#1.문자열인가
#2.@가 있는가 1번 2번 @로 통합 가능? => @가 없으면 모두 무효(문
#3.@가 하나인가 #@@나란히 오면 '@@'사이를 공백으로 분리함 -> len()매서드로 집계 가능!
#4.@앞에 문자가 하나 이상인가
#5.@뒤에 도메인명이 있는가('.' 포함한 하나 이상의 문자) : try if 스플릿
def validate_emails(emails):
for email in email_list:
try:
if len(email.split['@']) > 2:
print(f'{email}은 무효한 이메일입니다.')
else:
if len(email.split['@'][0])<1:
print(f'{email}은 무효한 이메일입니다.')
else:
try:
if len(email.split['@'][1].split('.')[0]) < 1: #'.'이 없는 경우 입력해주기
print(f'{email}은 무효한 이메일입니다.')
else:
if len(email.split['@'][1].split('.')[1]) >= 1:
print(f'{email}은 유효한 이메일입니다.')
else:
print(f'{email}은 무효한 이메일입니다.')
except:
print(f'{email}은 무효한 이메일입니다.')
except:
print(f'{email}은 무효한 이메일입니다.')
validate_emails(email_list)
결과가 전부 '무효입니다'가 나와버림.
일단 천천히 살펴보는데 단순화부터 시켜야할 듯 해서 첫번째 이프부터 뒤에 걸로 통합하기로 결론
1차 정리
email_list = [
"example@example.com",
"wrongemail@.com",
"anotherexample.com",
"correct@email.co.uk"
]
#1.문자열인가
#2.@가 있는가 1번 2번 @로 통합 가능? => @가 없으면 모두 무효(문
#3.@가 하나인가 #@@나란히 오면 '@@'사이를 공백으로 분리함 -> len()매서드로 집계 가능!
#4.@앞에 문자가 하나 이상인가
#5.@뒤에 도메인명이 있는가('.' 포함한 하나 이상의 문자) : try if 스플릿
def validate_emails(emails):
for email in email_list:
try:
if len(email.split['@'][1].split('.')[0]) < 1: #'.'이 없는 경우 입력해주기
print(f'{email}은 무효한 이메일입니다.')
else:
if len(email.split['@'][1].split('.')[1]) >= 1:
print(f'{email}은 유효한 이메일입니다.')
else:
print(f'{email}은 무효한 이메일입니다.')
except:
print(f'{email}은 무효한 이메일입니다.')
validate_emails(email_list)
함수실험
그래서 이렇게 쳐봤더니...
email = 'example@example.com'
if len(email.split['@'][1].split('.')[0]) < 1:
print('무효한 이메일입니다.')
else:
print('유효')
Traceback (most recent call last):
File "C:/Users/neddy/Desktop/sparta_python/함수 실험.py", line 11, in <module>
if len(email.split['@'][1].split('.')[0]) < 1:
TypeError: 'builtin_function_or_method' object is not subscriptable
읭...?
subscriptable이면 괄호가 잘못됐다는 것 아녀...?ㅋㅋㅋㅋ
2차 정리 및 정답
def validate_emails(emails):
for email in email_list:
try:
if len(email.split('@')[0])<1:
print(f'{email}은 무효한 이메일입니다.') --승엽님 아니었음 이 조건 빼먹을뻔ㅋ
else:
if len(email.split('@')[1].split('.')[0]) < 1:
print(f'{email}은 무효한 이메일입니다.')
else:
if len(email.split('@')[1].split('.')[1]) >= 1:
print(f'{email}은 유효한 이메일입니다.')
else:
print(f'{email}은 무효한 이메일입니다.')
except:
print(f'{email}은 무효한 이메일입니다.')
validate_emails(email_list)
대충 이렇게 해서 정답.
그래도 괄호 잘못 친 덕에 어떻게 식을 단순화 할 수 있을지 고민하게 된듯...ㅎㅎ
좋은 경험이었다.
주요 포인트들
len() 함수:
-문자열도, 리스트도, 딕셔너리도 모두 길이 계산 가능
split() 매서드:
-매서드이니 절대로 대괄호[]가 아닌 소괄호()를 써야한다
-단순 문자도 쪼개서 리스트로 반환
-나란히 중복되는 문자가 있을 때, 이들 중 하나를 기준으로 쪼개면 중복 문자 사이도 공백으로 반환함. 즉, ' '으로 출력하며, 결과값을 len으로 함수처리하면 카운트 됨
-쪼개는 기준이 되는 문자 앞에 아무 것도 없더라도 쪼개면 공백으로 반환. 당연히 이에 대한 결과값을 len()함수 처리하면 카운트 됨
a = '@12'
a_split = a.split('@')
print(a_split) #출력값 : ['', '12']
print(len(a_split)) #출력값 : 2
ab = '@'
ab_split = a.split('@')
print(a_split) #출력값 : ['', '']
print(len(a_split)) #출력값 : 2
문제3.
주요 포인트 및 해본 것들
1. 참가자에 중복값이 있기 때문에 set()함수를 이용한 차집합으로는 미완주자 구하기 어려움.
2. 딕셔너리뿐만 아니라 리스트도 in을 사용해서
3. 딕셔너리의 성질을 잘 이용해서 더하고 빼볼것 ㅅㅂ
4. 리스트를 활용할 것 : append()와 remove(), pop, del
5.
Method | Description |
clear() | list속 모든 요소를 삭제하여 비어있는 list로 변환시킴 (원본 list에서 삭제됨) |
remove(value) | list속에서 value와 동일한 값을 삭제 (원본 list에서 삭제됨) |
pop(index) | list속에서 명시된 index의 요소를 삭제 (원본 list에서 삭제됨) |
del list[index] | list속에서 명시된 index의 요소를 삭제 (원본 list에서 삭제됨) |
https://cosmosproject.tistory.com/249
Python Basic : list clear, remove, pop, del (list속 요소 삭제하기)
Python list의 요소를 삭제할 수 있는 기능을 제공하는 method는 크게 4가지가 있습니다. 각 method의 특징은 다음과 같습니다. Method Description clear() list속 모든 요소를 삭제하여 비어있는 list로 변환시
cosmosproject.tistory.com
participant = ["mike", "lisa", "tom", "lisa"]
print('miked' in participant) #False 출력
# 예시 데이터
participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]
def find_non_completer(parti, comple):
for runners in a:
if runners in completion:
print(f'{runners}는 완주자입니다)')
else print(f)
이렇게 쓰면 중복자 처리가 안 될 것이 뻔히 보여서 쓰다 말았음
# 예시 데이터
participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]
def find_non_completer(comple):
c_dict = {'number' : ' ', 'completed' : ''}
for i, completers in enumerate(comple):
c_dict['number'] = str(i)
c_dict['completed'] = completers
print(c_dict)
find_non_completer(completion)
{'number': '0', 'completed': 'tom'}
{'number': '1', 'completed': 'mike'}
{'number': '2', 'completed': 'lisa'}
이렇게 나왓는데 생각을 하다보니 딕셔너리를 만들고서 있는 값을 빼주기만 하면 되기 때문에 굳이 번호 부여를 할 필요가 없다는 것을 깨달음. 이래서 필기가 중요함ㅋㅋ
def find_non_completer(comple):
c_dict = {}
for i, completers in enumerate(comple):
completed = int(i)
c_dict[completed] = completers
print(c_dict)
find_non_completer(completion)
이렇게 하니 드디어 {0: 'tom', 1: 'mike', 2: 'lisa'}
c_dict = {'completed' : 'name'}
c_dict['completed'] = 'a'
c_dict['completed'] = 'b'
print(c_dict)
'딕셔너리의 값을 업데이트하거나 새로운 쌍의 자료를 넣을 수 있습니다'
업데이트 = 사실상 변경.....
그리고 찾아보니 set()함수로 생성되는 결과값은 딕셔너리가 아닌 set이라는 것을 깨달음....집합을 의미하고 중복값은 불가능하다. 결국 구글링을 통해 list를 이용하는 방법을 찾아냄
participant = ["mike", "lisa", "tom", "lisa"]
completion = ["tom", "mike", "lisa"]
def find_non_completer(parti, comple):
for i, runners in enumerate(parti):
if runners in comple:
parti.remove(runners)
comple.remove(runners)
if i == 1:
break
print(parti)
print(comple)
find_non_completer(participant, completion)
['lisa', 'lisa']
['lisa']
롸???
전체 풀이과정은 다 풀고서 한 번 쓸 예정....
to be continued...
밤 12시 30분 이후 진행
def find_non_completer(parti, comple):
for i, runners in enumerate(parti):
if runners in comple:
parti.remove(runners)
comple.remove(runners)
if i == 2:
break
print(parti)
print(comple)
find_non_completer(participant, completion)
['tom', 'lisa', 'lisa']
['tom', 'lisa']
['tom', 'lisa']
['tom']
드디어 뭔가 좀 보이는 것 같기도? 했는데 이러면 톰에서 끝날수밖에 없음...
이름마다 번호 1씩 붙이기. 중복되면 두번째 동명이인은 2붙이기