«   2020/07   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Tags
more
Archives
Today
1
Total
5,876
관리 메뉴

CHIqueen

dict의 모든 value에 1씩 더하기 본문

프로그래밍/Python

dict의 모든 value에 1씩 더하기

사용자 CHIqueen 2020. 4. 5. 22:26

#오늘의 시간낭비

파이썬 오픈카톡방에 질문으로

 

"딕셔너리의 모든 값에 +1하는 좋은 방법이 있을까요?
반복문으로 모든 원소에 접근해야만 하나요?"

가 올라왔다.

 

list는 한줄로

list(map(lambda x:x+1,a))

으로 가능하지만 막상 dict는 한줄로 떠오르지 않았다.

 

for문으로는 간단하게

for i in c:
    c[i]+=1

매우 간단하게 2줄로 끝나지만 이대로 끝내면 재미없다.

파이썬은 사기이기 때문에 한줄로 끝내보려 한다.

dict(zip(a.keys(),map(lambda x:x[1]+1,a.items())))

다른 방법으론

dict(zip(a.keys(),map(lambda x:a.get(x)+1,a.keys())))

이것도 있는데 for코드가 빠를거 같다.

생각한 김에 테스트해보자

 

import timeit


def test1():
    return dict(zip(a.keys(),map(lambda x:x[1]+1,a.items())))

def test2():
    return dict(zip(b.keys(),map(lambda x:b.get(x)+1,b.keys())))

def test3():
    for i in c:
        c[i]+=1
    return c

a = dict(zip([chr(i) for i in range(48,85)],range(37)))
b = dict(zip([chr(i) for i in range(85,122)],range(37,74)))
c = dict(zip([chr(i) for i in range(66,103)],range(66,103)))

t1 = timeit.timeit('test1()', setup='from __main__ import test1', number=10000)
t2 = timeit.timeit('test2()', setup='from __main__ import test2', number=10000)
t3 = timeit.timeit('test3()', setup='from __main__ import test3', number=10000)

print("{}ms, {}ms, {}ms".format(int(t1*1000),int(t2*1000),int(t3*1000)))
98ms, 94ms, 39ms
81ms, 94ms, 39ms
90ms, 122ms, 41ms
85ms, 119ms, 40ms
81ms, 118ms, 43ms
88ms, 122ms, 46ms
81ms, 107ms, 40ms
81ms, 102ms, 42ms

당연한 결과였던거 같다.

value 계산을 하고 다시 key를 가져와 합치는걸 무시 못한다.

첫번째랑 두번째코드를 보면 뭔가 i-=-1 같은 코드느낌

효율성이 좋은걸 하자

0 Comments
댓글쓰기 폼