인사말

안녕하세요~!

오늘도 문제 푼 걸 리뷰하도록 하겠습니다

어제처럼 오전 ~ 저녁으로 나눠서

무엇을 했는지 시간 흐름대로 기록하도록 하겠습니다!

 

내일이 딕셔너리 개념 발표가 있기 때문에

오늘도 딕셔너리 문제를 풀어보려 합니다!

그 뒤로는 파이썬 문제를 풀어볼 거구요 😜

 

TMI(To0 Much Imformation)

비염과 감기 때문에 너무 힘드네요 ㅠㅠ

그래도 한 건 해야죠 😎


오전 (09 : 00 ~ 13 : 00)

오늘은 딕셔너리 중급 수준 문제 5번부터 고급 수준 문제 10번까지

총 6문제를 풀어볼 겁니다!

 

<문제 5. 딕셔너리 여러 개 합치기>

#딕셔너리 여러 개 합치기
# 문제 5: 두 개의 딕셔너리가 주어졌을 때, 두 딕셔너리를 합친 새로운 딕셔너리를 만들어 출력하세요. (중급)
# 출력 예시 : {'name': '최준호', 'score': 75, 'age': 24, 'major': '영문학'}
student1 = {
    'name': '최준호',
    'score': 75
}

student2 = {
    'age': 24,
    'major': '영문학'
}

두 딕셔너리를 합쳐서 새로운 딕셔너리를 만들어야 하는데,

두 딕셔너리를 합치는 함수가 뭔지 모르거든요,,

그래서

팀원분들께 물어본 결과, | 이걸 쓰면 합쳐진다고 하더라구요

print(student1 | student2)

역 슬레쉬 위에 있는 일자 모양을 적어주시면

{'name': '최준호', 'score': 75, 'age': 24, 'major': '영문학'}

이렇게 합쳐집니다!

알아야 할 함수랑 수식이 정말 많은 거 같아요 😣

무작정 외울 생각은 안 할 거구요,

계속 문제를 많이 풀어보면서 익숙해질 생각입니다

문제 풀면서 공부하는 게, 차라리 더 재밌거든요 😝

 

<문제 6. 딕셔너리에서 특정 키가 존재하는지 확인>

#딕셔너리에서 특정 키가 존재하는지 확인 
# 문제 6: 주어진 딕셔너리에서 name 키가 존재하는지 확인하고, 존재하면 "키가 존재합니다"를 출력하고,
# 존재하지 않으면 "키가 없습니다"를 출력하세요. (중급)
# 출력 예시 : 키가 존재합니다
student = {'name': '이하늘','age': 28}
#1트
for i in student6:
    if student6 == 'name':
        print("키가 있습니다")
    else:
        print("키가 없습니다")
키가 없습니다
키가 없습니다

??????

왜 print()가 두 번이 되는지도 궁금하고

print(type(student6) 했을 때

dict로 나와서 그런 걸까요? 적용이 안 되네요..? 🧐

 

이 고민을 하면서 30분이나 걸린 문제입니다..

물론 튜터 님과 매니저 님께 자문을 구하였지만,

돌아와서 다시 혼자 생각을 해보니까

비슷한 문제가 생겼을 때,

스스로 해내진 못 할 거 같더라구요 🥲

그래서 

혼자 다시 생각해보았습니다

 

제가 간과했던 개념이, for은 순차적으로 순회 검사를 한다는 거였어요

그래서 결과값이 두 번이나 나왔던 거고, 

#2트
if i == 'name':
    print("키가 있습니다")
else:
    print("키가 없습니다")

if문 뒤에 적었던 student6는 dict의 타입이기 때문에

== 뒤에 오는 'name'과는 타입이 안 맞아서 오류가 났더라구요

그래서 if 뒤에 i를 적어주고 다시 돌려보았습니다.

Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/딕셔너리 문제.py", line 63, in <module>
    if i == 'name':
       ^
NameError: name 'i' is not defined. Did you mean: 'id'?

오류를 돌려받았습니다 ㅎ

생각해보니까 ㅋㅋㅋㅋㅋ i라는 거는 for을 위해서 만든 애기 때문에

지워주거나 student6로 바꿔줘야 했는데 말이죠 ㅋㅋㅋㅋ,,

# 3트
if student6 :
    print("키가 존재합니다")
else:
    print("키가 없습니다")

그래서 for문 지워주고, dict student6를 넣어줬는데

생각해보니까,, 딕셔너리의 'name'만 가져 오고 싶은 거잖아요,,

어떻게 해야 할지 고민 많이 했습니다,,

 

튜터 님께 어제 받은 사이트를 뒤적거리면서 알게 됐는데요

딕셔너리에 속한 Method가 되게 많더라구요

영어로 되어있긴 하지만 해석은 가능하니까 읽어보았습니다

get() : Returns the value of the specified key

https://www.w3schools.com/python/python_dictionaries_methods.asp

"구체적인 key의 value 값을 다시 보여준다"고 이해했거든요

그래서 .get()을 써서 활용해 보았습니다.

if student6.get('name'):
    print("키가 존재합니다")
else:
    print("키가 없습니다")
키가 존재합니다

전 저 자신에게 무궁무진한 박수와 칭찬을 해주고 싶어요

문제 풀다가 막혀서 혼자 처음엔 낑낑거리다가

자문을 구하러 여기저기 돌아다니고,

힌트를 받아서 혼자 생각하고 해낸 게 짜릿했습니다

어쨌든 해냈다는 거고? 도파민도 팡팡 터지네요 🤪

 

<문제 7 . 중첩된 딕셔너리>

#중첩된 딕셔너리
# 문제 7: 다음과 같은 중첩된 딕셔너리에서 address 값을 출력하는 프로그램을 작성하세요. (고급)
# 출력 예시 : 서울시 강남구
person = {
    'name': '김하나',
    'contact': {
        'email': 'hana@naver.com',
        'phone': '010-1234-5678'
    },
    'address': '서울시 강남구'
}

어찌하여 이런 시련을 주셨을까요..

머리 터질 것 같습니다..

아침을 잘 챙겨먹지 않는 편인데, 요즘 들어서 머리를 많이 썼더니

배가 너무 고프더라구요 😂

그리고 나중에 체력 때문에 지장이 생길까 봐,

교육 끝난 후 운동까지 했더니 배가 금방 고파져요

아주 바람직한 흐름인 거 같아요 😉

print(person.get('address'))
서울시 강남구

??????? 🧐????

뭐죠

일단 값을 불러오고 싶은 거니까 .get()을 써서 불러왔는데

바로 불러와지네요? 왜죠? 뭐죠?

어쨌든 문제를 풀었으니 된 거지만

만약 'adress'가 아니라 'email'이었으면 어떻게 가져와야 할지

잘 모르겠더라구요

궁금하고 찝찝한 건 못 참죠.

# email 꺼내기 1트
email = print(person.get('email'))
None

거참.. 단호하고 확실해서 좋네요 😤

# email 꺼내기 2트
email = print(person.get('contatct'), person.get('email'))
None None

이 접근 방식이 아닌가,,

그나저나 .get() 개념을 다시 확인 해봐야겠어요

dictionary.get(keyname, value)
Parameter : Description
keyname : Required. The keyname of the item you want to return the value from
value : Optional. A value to return if the specified key does not exist. Default value None

value가 옵션이군요? key가 있어야 있고, 없으면 없어지는 그런,,

호오 🧐

개념 설명은 알게 되었지만 활용 방법을 모르겠어서

튜터 님께 가져가보았습니다 ㅋㅋㅋㅋ..

# email 꺼내기 1트 (email에 할당하는 정의가 없음)
email = print(person.get('email'))

# email 꺼내기 2트 (email에 할당하는 정의가 없음)
email = print(person.get('contatct'), person.get('email'))

# email 꺼내기 3트 (튜터 님과 함께))
contact = person.get('contact')
email = contact.get('email')
print(email)
person.get('contact').get('email')
person['contact']['email']

전체적으로 제 흐름들을 설명드리며 자문을 구했는데요

기본 개념부터 차근차근 알려주시더라구요

접근법은 좋았다고 말씀 해주셨습니다 😳

그리고 코드를 완성시키는데 도움도 주시고 피드백도 해주셨어요!

email = print(person.get('email'))
email = print(person.get('contatct'), person.get('email'))

제가 다짜고짜 print()를 냅다 적었잖아요?

이렇게만 두면 값이 바뀌더라도 할당할수가 없어서 아쉽다고 하시더라구요

그래서 다음부턴 할당을 하고, print()해야겠다는 걸 깨달았습니다!

생각해보니, 변수값이라서 바뀔수도 있는데

변수에 대해서 할당하는 문장을 입력 안 했네요 🥵

# email 꺼내기 3트 (튜터 님과 함께))
contact = person.get('contact')
email = contact.get('email')
print(email)
person.get('contact').get('email')
person['contact']['email']

 

딕셔너리 내용이 뭐였죠?

person = {
    'name': '김하나',
    'contact': {
        'email': 'hana@naver.com',
        'phone': '010-1234-5678'
    },
    'address': '서울시 강남구'
}

첫 번째로

"person"의 딕셔너리 -> 'name', 'contact', 'address'가 있고

"contact"의 딕셔너리 -> 'email', 'phone'가 있습니다

총 두 개의 딕셔너리로 구성되어 있는 구조인 거죠!

contact = person.get('contact')
email = contact.get('email')

print(email)

그렇기에 할당값을 적어내리자면

'contact'는 'person' 딕셔너리 안에 있으니까 'person'에 있다고 해주구요

'email'은 'contact' 딕셔너리 안에 있으니까 'contact'에서 가져오겠다고 해주면 됩니다!

hana@naver.com

이렇게 값에 대한 할당을 해주고,

print()를 해준다면! 원하는 키 값 'email'에 대한 value 값 'hana@naver.com'이 나오는 거죠 😋

도파민 쩌는 깨달음이었습니다 😏

person.get('contact').get('email')
person['contact']['email']

그리고 이렇게도 표현이 가능하다고 알려주시더라구요!

person['contact']['email']

이때는 ['키 값']이 없을 경우 오류가 발생할 수 있습니다.

person.get('contact',{}).get('email',{})

그래서 이렇게 쓴다고 하시는데, 왜인지는 아직 이해 못 했어요

튜터 님께 숙제로 받은 ".get('키 값', {})에서 중괄호를 넣는 이유"는

오후에 고민해보려구요 🧐 (14시까지 오라고 하셧움,,)

 

<문제 8. 딕셔너리 값에 리스트 포함하기  >

#딕셔너리 값에 리스트 포함하기
# 문제 8: 주어진 student_scores 딕셔너리에서 각 학생의 점수를 평균을 구하여 출력하세요. (고급)
# 출력 예시
#홍길동의 평균 점수: 87.67
#이영희의 평균 점수: 85.00
#김철수의 평균 점수: 92.33
student_scores = {
    '홍길동': [85, 90, 88],
    '이영희': [78, 82, 95],
    '김철수': [92, 94, 91]
}
홍 = student_scores.get('홍길동')
이 = student_scores.get('이영희')
김 = student_scores.get('김철수')

# 1트
print(avg("홍길동의 평균 점수:" "홍","이영희의 평균 점수:" "이",
          "김철수의 평균 점수:" "김"))
Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/딕셔너리 문제.py", line 118, in <module>
    print(avg("홍길동의 평균 점수:" "홍","이영희의 평균 점수:" "이",
          ^^^
NameError: name 'avg' is not defined

?????? 아니 Python에 avg()가 없어요?????

SQL에만 있는 거예요??????

 

# 2트
평균 = sum(student_scores) / len(student_scores)
print("평균")
Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/딕셔너리 문제.py", line 122, in <module>
    평균 = sum(student_scores) / len(student_scores)
           ~~~^^^^^^^^^^^^^^^^
TypeError: unsupported operand type(s) for +: 'int' and 'str'
baeminkyung@baemingyeong-ui-MacBookAir Desktop %

'타입이 달라서 안 되는구나,,'

미치겠어요

와,, 머리가 안 굴러 가요 ㅠㅠㅠ

 

계속 머리를 굴리다가 점심 시간이 되어서 잠시 멈추었습니다..


오후 (14 : 00 ~ 18 : 00)

점심시간이 지난 후,

내일은 팀별로 발표가 있기 때문에 팀 회의가 조금 길어졌어요

16시부터 18시까지 회의를 하게 되어서

16시 전까지 발표장표를 각자 만들어 오기로 했거든요!

딕셔너리 (Dictionary).pdf
0.26MB

제일 마음에 드는 부분입니다

내일 제가 발표하기 때문에 파일을 계속 돌아보면서

모의 발표 연습도 해보았습니다

시간 정말 금방 가네요 😭


저녁 (19 : 15 ~ 21 : 00)

#딕셔너리 값에 리스트 포함하기
# 문제 8: 주어진 student_scores 딕셔너리에서 각 학생의 점수를 평균을 구하여 출력하세요. (고급)
# 출력 예시
#홍길동의 평균 점수: 87.67
#이영희의 평균 점수: 85.00
#김철수의 평균 점수: 92.33
student_scores = {
    '홍길동': [85, 90, 88],
    '이영희': [78, 82, 95],
    '김철수': [92, 94, 91]
}

저녁이 되어서는

오전에 풀다가 멈춘 8번 문제를 다시 보았습니다.

# 3트 - 튜터 님과 함께
for k in student_scores.keys():
    print(k)
total = 0

for v in student_scores.values():
    # print(v)
    total += v
    print(total)
    print(len(v))
    
# print(sum(v)) / len(v) -> for문 안이 아니라 밖에서 print() 돌려서 타입이 다름

튜터 님께서 딕셔너리에서 for문을 쓸 때는 달라진다고 하시더라구요

처음에는 무슨 말씀이신지 이해를 못 했는데

설명을 들으면 들을수록 느낌적으로 알 듯 말 듯 하더라구요 🤨

1시간 혼자 고민 하고

1시간 동안 튜터 님과 함께 교류하며

문제 해결 접근 방식을 논의해보았습니다

그래도 결론이 나지 않았지만요 😢

그래서

내일 마져 얘기 나누기로 했습니다!

저도 내일 발표 끝난 후 좀 더 생각해보고

내일 다시 얘기 해보려구요 ㅎㅎㅎㅎ

 

알듯 말듯한 이 기분이 간질거리고 흥미로워서

너무 재밌습니다 ㅎㅎ

배우면 배울수록 더 잘하고 싶어요 💪🏻


마무리

오늘이 제일 시간 빨리 갔던 거 같아요

튜터 님과 배움을 이어가던 중

오랜만에 list 얘기가 나왔는데, 뇌정지 왔어요 ㅋㅋㅋㅋㅋ

요즘 딕셔너리랑 for문만 보니까 기억이 안 나더라구요

튜터 님께서 당연히 지금은 익숙치 않아서 떠오르지 않다고 해주셔서 감사했습니다

갈고 닦아서 보석 같은 사람이 될게요 🤪

많이 혼내주시고 많이 가르쳐 주세요 😘

꾸준한 제가 되겠습니다!

감사합니다!

+ Recent posts