CHIqueen
dict의 모든 value에 1씩 더하기 본문
#오늘의 시간낭비
파이썬 오픈카톡방에 질문으로
"딕셔너리의 모든 값에 +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 같은 코드느낌
효율성이 좋은걸 하자
'프로그래밍 > Python' 카테고리의 다른 글
UMDCTF Fragile Foundations (0) | 2020.04.23 |
---|---|
python 자료형별 시간복잡도 (0) | 2020.04.11 |
백준 4344 평균은 넘겠지 한줄 풀이 (0) | 2020.04.09 |
PDF 에서 사진만빼서 다시 PDF 만들기 (1) | 2020.03.13 |
Python hwp to pdf (4) | 2020.02.21 |
Comments