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
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