딕셔너리 , 딕셔너리 comprehension

BackEnd_Ash.log·2020년 2월 18일
0

파이썬

목록 보기
7/34

2020.09.25 딕셔너리 정렬

zip 함수를 활용한 다양한 예

z = zip(['a', 'b', 'c'], [1, 2, 3])
for i in z:
    print(i, end=' ') # ('a', 1) ('b', 2) ('c', 3) 

zip 을 사용하게 되면 이와 같이 튜플로 뱉어 내게 된다.

만약에 list 로 감싸게 된다면 ??

d = list(zip(['a', 'b', 'c'], [1, 2, 3]))
print(d)  # [('a', 1), ('b', 2), ('c', 3)]

zip 을 딕셔너리로 감쌀수도 있다.

d = dict(zip(['a', 'b', 'c'], (1, 2, 3)))
print(d)  # {'a': 1, 'b': 2, 'c': 3}

딕셔너리 수정

d = dict(a=1, b=2, c=3)
vo = d.items()  # 뷰 객체 얻음
for kv in vo:
    print(kv, end=' ')  # ('a', 1) ('b', 2) ('c', 3)

d['a'] += 3  # 딕셔너리 수정
d['c'] -= 2  # 딕셔너리 수정
for kv in vo:
    print(kv, end=' ')  # ('a', 4) ('b', 2) ('c', 1)

딕셔너리 컴프리헨션

리스트 컴프리헨션 뿐만 아니라 딕셔너리 컴프리헨션도 가능하다.

d1 = dict(a=1, b=2, c=3)
d2 = {k: v * 2 for k, v in d1.items()}
d3 = {k: v * 2 for k, v in d2.items()}
print(d1)  # {'a': 1, 'b': 2, 'c': 3}
print(d2)  # {'a': 2, 'b': 4, 'c': 6}
print(d3)  # {'a': 4, 'b': 8, 'c': 12}
dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f':6}

# Identify odd and even entries
dict1_tripleCond = {k:('even' if v%2==0 else 'odd') for (k,v) in dict1.items()}

print(dict1_tripleCond)
# {'f': 'even', 'c': 'odd', 'b': 'even', 'd': 'even', 'e': 'odd', 'a': 'odd'}

리스트를 딕셔너리 컴프리 헨션으로

people = ["철수" , "영희" , "길동" , "순희"]
{ p : 0 for p in people } 
{'철수': 0, '영희': 0, '길동': 0, '순희': 0}

조건문 있는 딕셔너리 컴프리 헨션

scores = {'철수': 50, '영희': 80, '길동': 90, '순희': 60, '전학생': 100}
scores = { name: score for name, score in scores.items() if name != '전학생'}
print(scores)

if else 있는 딕셔너리 컴프리 헨션

grades = { name: 'PASS' if value > 70 else 'No-PASS' for name, value in scores.items()}
print(grades)

해석방법은 list comprehension 과 크게 차이가 없다.
단지 dict 은 key 와 value 형식이다.

d1 = dict(a=1, b=2, c=3, d=4)
d2 = {k: v for k, v in d1.items() if v % 2}  # d1에서 값이 홀수인 것만 모은 딕셔너리
print(d2)  # {'a': 1, 'c': 3}
  1. d1 의 키와 값을 하나씩 k , v 에 넣어서 # {k: v for k, v in d1.items() if v % 2}

2 . v %2 가 True 인지 확인하고 , # {k: v for k, v in d1.items() if v % 2}

  1. True 이면 k : v 를 딕셔너리에 추가. # {k: v for k, v in d1.items() if v % 2}

zip 과 같이 사용

ks = ['a', 'b', 'c', 'd']  # 이들은 키가 된다.
vs = [1, 2, 3, 4]  # 이들은 값이 된다.
d = {k: v for k, v in zip(ks, vs)}
print(d)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}


```python
ks = ['a', 'b', 'c', 'd']  # 이들은 키가 된다.
vs = [1, 2, 3, 4]  # 이들은 값이 된다.
d = {k: v for k, v in zip(ks, vs) if v % 2}
print(d)  # {'a': 1, 'c': 3}

딕셔너리 순서정렬

  • 키를 기준으로 오름차순 정렬
pgm_lang = {

    "java": 20, 

    "javascript": 8, 

    "c": 7,  

    "r": 4, 

    "python": 28 } 
    
result1 = sorted(pgm_lang.keys())
print(result1)
# ['c', 'java', 'javascript', 'python', 'r']


result2 = sorted(pgm_lang.items())
print(result2)
# [('c', 7), ('java', 20), ('javascript', 8), ('python', 28), ('r', 4)]

딕셔너리 정렬

딕셔너리는 기본적으로 key 를 기준으로 올림 차순 정렬이 됩니다.

fruits = { 'apple': 2, 'banana' : 1, 'melon' : 0, 'pear' : 2, 'plum' : 1}

print(sorted(fruits))
print(sorted(fruits.keys())

두개의 값은 똑같이 나온다.

딕셔너리 value 기준 정렬

lambda 함수를 사용하여 value 값을 기준으로 정렬하라고 하면 됩니다.

sorted(fruits , key = lambda k : fruits[k])

반환은 list 형태로 반환이 된다.

역순으로 하기를 원한다면 reverse 를 사용하면 됩니다.

sorted(fruits , key = lambda k : fruits[k] , reverse = True)

똑같이 list 형태로 반환이 됨.

딕셔너리 items() 정렬


printsorted(fruits.items(), key=lambda t : t[1]))

[('melon', 0), ('plum', 1), ('banana', 1), ('pear', 2), ('apple', 2)]
profile
꾸준함이란 ... ?

0개의 댓글