2011-12-06 3 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 조건과 일치하는 값이 하나 이상 있는지 확인 했습니까? - 즉, 값이 반환하는 경우 counter이 비어있는 경우

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

확인보고 : 나에게 그것은

에 체크 아웃은 ... 당신의 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