Python 计数器不计数

Python Counter doesn't count

import urllib2
f=urllib2.urlopen("http://www.mbnet.com.pl/dl.txt")
list = range(1,50)
counter={}

for lines in f:
    tab_lines=lines.split(" ")
    formated_tab=tab_lines[-1].strip().split(',')
    #print formated_tab
    for i in formated_tab:
        if i in list:
            counter[i]+=1
print counter.items()

我的 counter 不工作,我不知道为什么 :(

这是一个彩票号码列表。我想数一数每个号码抽了多少次

您正在比较 字符串 整数 。您的 if 测试从未匹配:

if i in list:

因为每个i都是一个字符串。另一方面,您的 list 变量包含整数:

list = range(1,50)

i 转换为整数以针对其他整数进行测试:

if int(i) in list:

其他一些说明:

  • list 不是一个好的变量名;你在掩盖 built-in type.

  • 您可以通过对起始值和结束值使用比较运算符来测试 i 是否在一个范围内:

    if 1 <= int(i) < 50:
    

    这样会更快,因为您不必每次都浏览列表。

  • 您不能假设密钥已经存在于 counter 中。您必须先测试或使用 counter.get() 到 return 默认值。例如:

    counter[i] = counter.get(i, 0) + 1
    
  • 要计算您的值,您可以使用标准库 collections.Counter() class:

    from collections import Counter
    
    counter = Counter()
    
    for lines in f:
        tab_lines = lines.split()  # note, no argument!
        formatted_tab = map(int, tab_lines[-1].split(','))
        counter.update(i for i in formatted_tab if 0 < i < 50)
    
    print counter.most_common()
    

    在我的测试中,我没有在该文件中看到任何超出 0 到 50(不含)范围的数字,因此您可以只使用 counter.update(formatted_tab).

除了还有一个问题。您正在访问字典中不存在的字典键。而不是

counter[i]+=1

你应该使用

counter[i] = counter.get(i, 0) + 1

非常感谢你们!

我完成了这段代码:) !

import urllib2
f=urllib2.urlopen("http://www.mbnet.com.pl/dl.txt")
list = range(1,50)
counter={}

for lines in f:
    tab_lines=lines.split(" ")
    formated_tab=tab_lines[-1].strip().split(',')
    for i in formated_tab:
        if int(i) in list:
                counter[i] = counter.get(i, 0) + 1
sumall=sum(counter.values())
for number, value in counter.items():
    print ('Number {} drawn {} times and it is {}% of all ').format(number,value,100*value/sumall)

而不是使用:

counter[i] = counter.get(i, 0) + 1

你也可以试试collections.defaultdict:

counter = defaultdict(int)

所以你的最终版本应该是这样的:

import urllib2
from collections import defaultdict

f=urllib2.urlopen("http://www.mbnet.com.pl/dl.txt")
list = range(1,50)
counter=defaultdict(int)  # use defaultdict here

for lines in f:
    tab_lines=lines.split(" ")
    formated_tab=tab_lines[-1].strip().split(',')
    for i in formated_tab:
        if int(i) in list:
            counter[i] += 1  # don't worry, be happy :)
sumall=sum(counter.values())
for number, value in counter.items():
    print ('Number {} drawn {} times and it is {}% of all').format(number,value,100*value/sumall)

我会给你一个例子来说明 collections.defaultdict 在这里做了什么:

>>> from collections import defauldict
>>> a = {}
>>> a['notexist']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'notexist'
>>> b = defaultdict(int)
>>> b['notexist']
0

class collections.defaultdict([default_factory[, ...]]) defaultdict 是内置字典 class 的子 class,所以不要害怕,但您可以用它做更多事情。一旦你指定了default_factory变量,当key不存在时,defaultdict会根据default_factory为你提供一个。请注意,只有当您使用 dict['key']dict.__getitem__(key).

时才会发生这种魔法

资料在这里:collections.defaultdict