【Python】获得列表中每个元素出现的次数(最优方法)

周五的时候,leader给我了一个数据分析的小任务,其中第一步就是从数据库里读取代码,然后统计某一列元素出现的次数。说是小任务,其实也不怎么小,大概十亿条数据吧。。。嘤嘤嘤。。。。

然后我一看,这个好眼熟,我以前做过呀,先新建一个字典,key对应数据库那一列对应的元素,value存储元素个数,然后对数据库里每个元素进行判断,如果有相同的key,则value+1,如果没有,那么就新增这个key,并且令value=1 。写完之后我就心满意足的回家了,想着今天早上来到就可以给leader看结果,感觉自己超级厉害。但是。。。今天早上来到就傻眼了,咦?程序还没有跑完。。。。然后我就取一万条数据测试了一下,大概需要417个小时才能跑完,还是在忽略了dictionary越来越大,存储越来越慢的情况下。。。。 

在网上看了几种方法,自己实际测试了一下:

方法一:就是我刚刚说的那个,最傻的方法。。。

方法二:使用list.count(),可以得到每一个元素,在list中出现的次数

方法三:collections.Counter()方法,速度快到惊人,不知道是哪个大佬写的,超级厉害,最后我就是用的这种方法。

方法四:听说numpy.unique()也可以?反正我对这种方法略有疑问,再加上懒,就不总结了。

直接看代码吧,感觉注释挺详细的

#coding=utf-8
from collections import Counter
import numpy
import time

#随机生成一个含有一百万个正整数的列表
def get_random_list():
    numpy.random.seed(10)
    return numpy.random.randint(0,1000000,1000000)

#第一种方法:字典
def get_count(l):
    dict = {}
    t1 = time.time()
    for i in l:
        #如果元素之前在字典里,那么元素对应的value值+1
        if i in dict.keys():
            dict[i] = int(dict[i]) + 1
        #如果不在,字典中新增对应的items
        else:
            dict[i] = 1
    t2 = time.time()
    print dict
    print (t2-t1)

#第二种方法:list的count()函数:用于统计某个元素在列表中出现的次数
def get_count_by_count(l):
    dict = {}
    t1 = time.time()
    s = set(l) #集合:得到不重复的元素
    for i in s:
        dict[i] = l.count(i) #对集合中每个元素分别计数,存入dictionary中
    t2 = time.time()
    print (t2-t1)
    return dict

#第三种方法:使用collections.Counter()函数
#直接collections.Counter(list)就可以得到list中每个元素的个数
#返回类型是collections.Counter,可以将其手动转换为dict
def get_count_by_counter(l):
    t1 = time.time()
    count = Counter(l)   #类型: <class 'collections.Counter'>
    t2 = time.time()
    print (t2-t1)
    count_dict = dict(count)   #类型: <type 'dict'>
    return count_dict
    #or return count

if __name__ == "__main__":

    l = get_random_list()
    #print l.count(345353)
    #get_count(l)
    #get_count_by_count(l)
    get_count_by_counter(l)

我本来想详细给出每个方法详细用时的,但是三个小时过去了,100万条数据

方法一的结果还没有出来

方法二没有具体测试,不过肯定是比方法一快,但是对于大规模数据依旧不适用

扫描二维码关注公众号,回复: 5290847 查看本文章

方法三:我还没有来得及眨眼睛,100万条数据,不到一秒钟就运行完了。

感觉今天又发现了新大陆哪,超级开心,哈哈哈哈哈哈。

猜你喜欢

转载自blog.csdn.net/sunshine__0411/article/details/80792970