2011-12-06 11 views
0
querytimes = "SELECT video_id, COUNT(src_ip) FROM video GROUP BY video_id ORDER BY COUNT(src_ip) DESC" 
cur.execute (querytimes) 
dltimes = cur.fetchall() 
for row in dltimes: 

    videoid = str(row [0]) 
    downloadtimes = int(str(row [1])) 
    x.append(rank) 
    rank = rank + 1 
    y.append(downloadtimes) 
    v.append(videoid) 


counter = dict(zip(v, y)) 
for n in xrange(1, max(counter.itervalues()) + 1): 
    perc = 100./sum(1 for nb in counter.itervalues() if nb == n)/len(counter) 
if perc: 
    print '%.f%% videos have been downloaded %d times' % (perc, n) 

これは私のコードです。最初に私は、データベースからデータを読み取るその後、辞書に動画IDとdownloadtimesを入れて、いくつかの計算を行うが、私は次のエラーを得た:ZeroDivisionError:float division in Python

perc = 100./sum(1 for nb in counter.itervalues() if nb == n)/len(counter) ZeroDivisionError: float division

誰もが少しを助けることができますか?

+0

は、その最後の 'for'ループ右か? 'if'部分はループ内になければなりません。さもなければ、それは一度だけ実行されます –

答えて

3

counter辞書にnb == nの条件に一致する値が1つ以上あることを確認しましたか? - 他の言葉で、値が返された場合

>>> n = 3 
>>> counter = {'a': 1} 
>>> 100./sum(1 for nb in counter.itervalues() if nb == n)/len(counter) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ZeroDivisionError: float division by zero 
>>> counter = {'a': 3} 
>>> 100./sum(1 for nb in counter.itervalues() if nb == n)/len(counter) 
100.0 
0

がチェックcounterが空であるかどうかを確認するために:私にはそれがあなたのsumたりlenリターン0

...結果としてチェックこのうちのいずれかのように思えます dltimesには要素がありません。私は forループ内でこのような何かをしたい:

if counter: 
    perc = 100./sum(1 for nb in counter.itervalues() if nb == n)/len(counter) 
else: 
    perc = 0 

また、それは本当だnb == n値がないいる可能性があります。その場合:

s = sum(1 for nb in counter.itervalues() if nb == n) 
if counter and s: 
    perc = 100./s/len(counter) 
else: 
    perc = 0