2015-05-14 117 views
0
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不工作,我不知道爲什麼:(Python的計數器不計數

這是彩票號碼的清單。我想指望有多少次繪製的每個號碼。 。

+1

不要使用列表作爲變量名。 –

回答

0

而不是使用:

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是內置的dict類,所以不要害怕一個子類,但你可以用它做更多。一旦您指定了default_factory變量,當密鑰不存在時,defaultdict將根據default_factory爲您提供一個。請注意,只有當您使用dict['key']dict.__getitem__(key)時,纔會發生這種魔術。

的doucumetaion是在這裏:collections.defaultdict

+0

謝謝你的演出我這個功能:)並解釋它是如何工作:)我將在未來使用:) – Rarez

1

您比較整數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()返回默認值。例如:

    counter[i] = counter.get(i, 0) + 1 
    
  • 要計算你的價值觀,你可以使用標準庫collections.Counter()類:

    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)逃脫。

+0

除此之外,覆蓋'list'不是一個好主意,並且'counter [i] + = 1'會拋出一個錯誤,因爲'counter [i]'還沒有被設置... –

0

除了Martin Pieters' answer還有另一個問題。您正在訪問字典中不存在的字典密鑰。取而代之的

counter[i]+=1

你應該使用類似

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

0

這麼多的感謝你們!

我完成了這段代碼:)!

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)