TIL 통합

01/05 개인과제 문제 풀이 과정

네디0318 2024. 1. 5. 21:33

어제 저녁부터 종일 문제풀이만 하는 중.

 

문제 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붙이기