计算列表中字符串或浮点数的频率

时间:2013-10-08 04:00:14

标签: python list python-2.7 count frequency

我有一份清单。它非常大。它有超过100万条目。我想计算每个字符串的频率。它将数字存储为1到1000之间的字符串。我使用了以下内容但它仍然运行了几个小时:

d = {b:a.count(b) for b in a}
n, m = d.keys(), d.values()
print n, m

3 个答案:

答案 0 :(得分:7)

改为使用collections.Counter

from collections import Counter
d = Counter(a)

n, m = d.keys(), d.values()
print n, m

答案 1 :(得分:1)

它很慢,因为你为每个字符串运行一个.count!

l = ['a', 'b', 'a']

然后{'1}}将在'a'上调用两次,在'b'上调用一次。

当然第二次在'a'上字典中的结果被覆盖,所以你甚至没有注意到它

使用默认字典

str.count

或者,再次从集合模块中,计数器http://docs.python.org/2/library/collections.html#counter-objects

答案 2 :(得分:1)

我认为在这种情况下使用字典要容易得多。 插入字典非常快,从字典中检索也同样快。

以下是一个示例程序:

import datetime
import random
def create_string(choice, size):
    str = ''
    for i in range(size):
         str = str + random.choice(choice)
    return str

def count_all(strings):
    count_dict = {}
    for i in strings:
        if i not in count_dict:
            count_dict[i] = 1
        else:
            count_dict[i] = count_dict[i] + 1
    return count_dict

if __name__ == '__main__':
    all_strings = []
    for i in range(1000000):
        all_strings.append(create_string(['a','b','c'], 4))

    start = datetime.datetime.now()
    c_dict = count_all(all_strings)
    end = datetime.datetime.now()
    print 'Took:', end - start
    print 'The count of aacc is ', c_dict['aacc']

它是如何公平的?

./speed_test.py
Took: 0:00:00.219815
The count of aacc is  12317

一点也不差,嘿? 作为替代选项,要解决Ant提到的问题,您希望在执行计数时删除重复项。我们可以使用一套:

d = {b:a.count(b) for b in set(a)}

根据我的测试,这不如字典方法快,但不到一秒就足够了。