Python中的零除错误:浮点除法

0 投票
2 回答
7790 浏览
提问于 2025-04-17 07:48
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和下载次数放进一个字典里,接着进行一些计算,但我遇到了以下错误:

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

有没有人能帮我一下?

2 个回答

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
3

你有没有检查过你的 counter 字典里是否至少有一个值符合 nb == n 这个条件?我觉得可能是你的 sum 或者 len 返回了 0,所以才会出现这个问题……

看看这个:

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

撰写回答