python中倒序遍历字典元素_在Python中使用循环计算字典中元素的有效方法

本文探讨了在Python中如何倒序遍历字典元素,并比较了几种计算字典中元素出现次数的方法,包括使用集合和字典理解、Counter、setdefault、fromkeys以及get方法。通过性能测试,展示了不同方法在处理大规模数据时的效率差异,推荐在大型列表中使用defaultdict或fromkeys进行计数操作。
摘要由CSDN通过智能技术生成

对于较小的例子,由于元素的多样性有限,您可以使用集合和dict理解:>>> mylist = [1,1,1,1,1,1,2,3,2,2,2,2,3,3,4,5,5,5,5]

>>> {k:mylist.count(k) for k in set(mylist)}

{1: 6, 2: 5, 3: 3, 4: 1, 5: 4}

要将其分解,set(mylist)取消对列表的求值,使其更紧凑:

^{pr2}$

然后dictionary comprehension逐步处理唯一值并从列表中设置计数。在

这也比使用Counter和setdefault要快得多:from __future__ import print_function

from collections import Counter

from collections import defaultdict

import random

mylist=[1,1,1,1,1,1,2,3,2,2,2,2,3,3,4,5,5,5,5]*10

def s1(mylist):

return {k:mylist.count(k) for k in set(mylist)}

def s2(mlist):

return Counter(mylist)

def s3(mylist):

mydict=dict()

for index in mylist:

mydict[index] = mydict.setdefault(index, 0) + 1

return mydict

def s4(mylist):

mydict={}.fromkeys(mylist,0)

for k in mydict:

mydict[k]=mylist.count(k)

return mydict

def s5(mylist):

mydict={}

for k in mylist:

mydict[k]=mydict.get(k,0)+1

return mydict

def s6(mylist):

mydict=defaultdict(int)

for i in mylist:

mydict[i] += 1

return mydict

def s7(mylist):

mydict={}.fromkeys(mylist,0)

for e in mylist:

mydict[e]+=1

return mydict

if __name__ == '__main__':

import timeit

n=1000000

print(timeit.timeit("s1(mylist)", setup="from __main__ import s1, mylist",number=n))

print(timeit.timeit("s2(mylist)", setup="from __main__ import s2, mylist, Counter",number=n))

print(timeit.timeit("s3(mylist)", setup="from __main__ import s3, mylist",number=n))

print(timeit.timeit("s4(mylist)", setup="from __main__ import s4, mylist",number=n))

print(timeit.timeit("s5(mylist)", setup="from __main__ import s5, mylist",number=n))

print(timeit.timeit("s6(mylist)", setup="from __main__ import s6, mylist, defaultdict",number=n))

print(timeit.timeit("s7(mylist)", setup="from __main__ import s7, mylist",number=n))

在我打印的机器上(Python 3):18.123854104997008 # set and dict comprehension

78.54796334600542 # Counter

33.98185228800867 # setdefault

19.0563529439969 # fromkeys / count

34.54294775899325 # dict.get

21.134678319009254 # defaultdict

22.760544238000875 # fromkeys / loop

对于更大的列表,如1000万个整数,具有更多不同的元素(1500个随机整数),请在循环中使用defaultdict或fromkeys:from __future__ import print_function

from collections import Counter

from collections import defaultdict

import random

mylist = [random.randint(0,1500) for _ in range(10000000)]

def s1(mylist):

return {k:mylist.count(k) for k in set(mylist)}

def s2(mlist):

return Counter(mylist)

def s3(mylist):

mydict=dict()

for index in mylist:

mydict[index] = mydict.setdefault(index, 0) + 1

return mydict

def s4(mylist):

mydict={}.fromkeys(mylist,0)

for k in mydict:

mydict[k]=mylist.count(k)

return mydict

def s5(mylist):

mydict={}

for k in mylist:

mydict[k]=mydict.get(k,0)+1

return mydict

def s6(mylist):

mydict=defaultdict(int)

for i in mylist:

mydict[i] += 1

return mydict

def s7(mylist):

mydict={}.fromkeys(mylist,0)

for e in mylist:

mydict[e]+=1

return mydict

if __name__ == '__main__':

import timeit

n=1

print(timeit.timeit("s1(mylist)", setup="from __main__ import s1, mylist",number=n))

print(timeit.timeit("s2(mylist)", setup="from __main__ import s2, mylist, Counter",number=n))

print(timeit.timeit("s3(mylist)", setup="from __main__ import s3, mylist",number=n))

print(timeit.timeit("s4(mylist)", setup="from __main__ import s4, mylist",number=n))

print(timeit.timeit("s5(mylist)", setup="from __main__ import s5, mylist",number=n))

print(timeit.timeit("s6(mylist)", setup="from __main__ import s6, mylist, defaultdict",number=n))

print(timeit.timeit("s7(mylist)", setup="from __main__ import s7, mylist",number=n))

印刷品:2825.2697427899984 # set and dict comprehension

42.607481333994656 # Counter

22.77713537499949 # setdefault

2853.11187016801 # fromkeys / count

23.241977066005347 # dict.get

15.023175164998975 # defaultdict

18.28165417900891 # fromkeys / loop

您可以看到,与其他解决方案相比,在大列表中转发count次数适中的解决方案将受到严重/灾难性的影响。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值