본문 바로가기
python/메모장

[python] 딕셔너리 포함여부 및 리스트 추가

by GJ999 2023. 1. 8.

내가 추가하고자 하는 값이 딕셔너리에 있는지를 판별한 후, 해당 key의 value값에 추가하는 방식에 대해 알아보자.

예를 들어, 점심메뉴를 놓고 투표를 하고 있고, 점심메뉴와 해당 메뉴에 투표한 사람들의 이름이 아래와 같이 있다고 하자.

>>> lunch = {
...     '제육볶음' : ['홍길동', '뽀로로', '손오공'],
...     '짜장면' : ['차차','붐붐'],
... }

제육 볶음에 투표한 사람이 3명, 짜장면에 투표한 사람이 2명인 것을 알 수 있다.

이 때 내 이름은 '골드런', 내가 먹고 싶은 메뉴는 '김치찌개'라고 가정을 하고, 각자 key와 who라는 변수에 할당된다고 하자.

>>> key = '김치찌개'
>>> who = '골드런'

이제 key가 해당 딕셔너리에 있는지 판별 후, 있다면 기존 멤버 이름 리스트에 내 이름을 추가하고, 없다면 새로운 메뉴와 내 이름을 추가해야 한다.

1. if문과 list.append 사용

if 문으로 변수 key가 딕셔너리 lunch의 key값들에 포함에 포함되는지를 확인한 후, 만약 없다면 해당 딕셔너리 신규 key에 빈 리스트를 할당하고, 해당 리스트에 변수who를 추가하면 된다.

>>> if key in lunch:
...     lunch[key].append(who)
... else:
...     lunch[key] = []
...     lunch[key].append(who)
...
>>> lunch
{'제육볶음': ['홍길동', '뽀로로', '손오공'], '짜장면': ['차차', '붐붐'], '김치찌개': ['골드런']}

기존에 있던 메뉴('제육볶음')일 때도 잘 작동('골드런' 추가)하는 것을 아래에서 확인 할 수 있다.

 

>>> lunch = {
...     '제육볶음' : ['홍길동', '뽀로로', '손오공'],
...     '짜장면' : ['차차','붐붐'],
... }
>>>
>>> key = '제육볶음'
>>> who = '골드런'
>>> if key in lunch:
...     lunch[key].append(who)
... else:
...     lunch[key] = []
...     lunch[key].append(who)
...
>>> lunch
{'제육볶음': ['홍길동', '뽀로로', '손오공', '골드런'], '짜장면': ['차차', 
'붐붐']}
  • 응용 : 이중 대입문

위에서는 lunch[key].append 를 통해 lunch라는 딕셔너리에 직접적으로 key를 찾아들어가서 append 함수를 이용했다. 이와는 다르게 신규 변수를 사용하되 신규변수가 딕셔너리의 신규 키 값과 동일한 값이 연동되게끔 만들어 append를 사용하는 방법이 있다.

>>> lunch = {
...     '제육볶음' : ['홍길동', '뽀로로', '손오공'],
...     '짜장면' : ['차차','붐붐'],
... }
>>>
>>> key = '김치찌개'
>>> who = '골드런'
>>> if key in lunch:
...     lunch[key].append(who)
... else:
...     lunch[key] = names = []
...
>>> names.append(who)
>>> lunch
{'제육볶음': ['홍길동', '뽀로로', '손오공'], '짜장면': ['차차', '붐붐'], '김치찌개': ['골드런']}

else 뒤에 보면 lunch[key] = names = []  에 =이 두번 들어가는 이중 대입문을 사용했다.

그리고 그 뒤에 lunch[key]를 고치는게 아니라 names에 append로 who변수를 추가했더니 딕셔너리 lunch가 변했음을 알 수 있다. lunch를 고치는게 아니라 names를 고쳤는데 lunch가 바뀌다니?!

이는 변수를 할당할 때 복사가 되는 것이 아니라 서로 동일한 변수가 되게끔 하는 파이썬의 성질을 이용한 것이다.

>>> a = [1,2,3]
>>> b = a
>>> b.append(4)
>>> print(a)
[1, 2, 3, 4]

여기서도 b에 변화를 가했는데, a가 변하고 있다.

이는 b = a 에서 a를 복사해서 별도의 b를 설정한 것이 아니라, a와 b를 이름만 다르되 동일한 값을 가지게끔 연동시켰다고 보는 것이 편하다.

따라서 위의 예시에서도 이중 대입문을 통해 lunch[key]와 names라는 변수에 빈 리스트를 할당하되, 둘 중 어느 것 하나를 바꾸면 다른 것도 바뀌게끔 설정되었다.

이렇게 이중 대입문을 사용하면, 코드 가독성이 한결 좋아지는 것을 알 수 있다.

2. try ~ except ~ 문 사용

결과는 위의 if문과 동일하지만 코드가 좀 더 짧아지고 보기 좋아졌다.

>>> lunch = {
...     '제육볶음' : ['홍길동', '뽀로로', '손오공'],
...     '짜장면' : ['차차','붐붐'],
... }
>>>
>>> key = '김치찌개'
>>> who = '골드런'
>>> try :
...     lunch[key].append(who)
... except:
...     names = lunch[key] = []
...
>>> names.append(who)
>>> lunch
{'제육볶음': ['홍길동', '뽀로로', '손오공'], '짜장면': ['차차', '붐붐'], '김치찌개': ['골드런']}

 

반응형

댓글