2011-12-06 70 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'部分应该在_inide_循环中,否则它只会执行一次 –

回答

3

你检查了你的counter字典中有至少一个值与nb == n相匹配吗?对我来说,它看起来像或者您的sum或结果你len0 ...

检查了这一点:

>>> 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是空的 - 换句话说,如果返回的值在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