Python - 统计每个数字出现的次数

8
我有一长串用逗号分隔的数字。我可以搜索和计算大多数数字(更准确地说是两位数),出现的次数。
例如,如果我的数字序列如下: 1,2,3,4,5,1,6,7,1,8,9,10,11,12,1,1,2 我想要计算数字1出现的次数,那么我应该得到的结果是5
然而,由于它在101112中计算了1,所以我得到了9
有没有人知道如何让以下代码仅匹配整个“字符串”?
def mostfreq(numString):
    import json 
    maxNum=45
    count=1
    list={}
    while count <= maxNum:
        list[count] = 0
        count+=1
    #numString is the array with all the numbers in it
    count=1
    topTen = ""
    while count <= maxNum:
        list[count]=numString.count(str(count))
        topTen = topTen+json.dumps(
        {count: list[count]},
        sort_keys=True,
        indent=4)+","
        count+=1
    response_generator = ( "["+topTen[:-1]+"]" )
    return HttpResponse(response_generator)
1个回答

8

在2.7版本及以上,只需使用split函数并使用collections.Counter:

from collections import Counter
numstring = "1,2,3,4,5,1,6,7,1,8,9,10,11,12,1,1,2"
numcount = Counter(numstring.split(','))

或 Pre-2.7:

from collections import defaultdict
numstring = "1,2,3,4,5,1,6,7,1,8,9,10,11,12,1,1,2"
numcount = defaultdict(int)
for num in numstring.split(','):
    numcount[num] += 1

如果您想使用 count
numstring = "1,2,3,4,5,1,6,7,1,8,9,10,11,12,1,1,2"
numlist = numstring.split(',')
numcount = dict((num, numlist.count(num)) for num in set(numlist))

但是它的时间复杂度为O(m*n)而不是O(n),因为它会对每个唯一的数字迭代一次数字列表。


这是哪个版本的Python?我在2.6.7上尝试过,但我没有在collections中找到Counter。 - fncomp
@Josh Counter 是 2.7+,就像我说的一样(也许是你看过之后我添加的),但 defaultdict 的替代品是 2.5+。 - agf
为了向后兼容性加一(许多人使用Django等与2.6版本)。 - fncomp
非常正确。我自己正在使用Django / python 2.6!@agf,我已经让代码的一部分工作了。问题是,我试图按频率排序。我尝试使用上面的代码,其中sortedString = sorted(numcount,key = operator.itemgetter(1),reverse = True),但我收到一个错误,说“全局名称'operator'未定义”,即使我已经导入了from operator import itemgetter。有什么帮助吗?谢谢。 - eoinzy
另外,由于我正在输出JSON,我尝试在json.dumps代码中对其进行排序,但是sort_keys=true只按左侧的数字排序,而不是按频率排序:outputString+=json.dumps({num: numcount[num]},sort_keys=True,indent=4)+"," - eoinzy
1
@eoinzy,你需要使用numcount.iteritems(),而不仅仅是使用numcount,否则你只会得到键而不是键和值。如果你使用from operator import itemgetter,那么你只需要使用key=itemgetter(1)。如果你使用import operator,那么你需要使用key=operator.itemgetter(1) - agf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接