我现在有个txt文件如下:
1 167 334555717
2 19 334555718
2 167 334555718
3 167 334555720
4 172 334555721
5 21 334555723
5 147 334555723
5 50 334555723
第一列是序号,第二列是字数,第三列是ID。相同ID的序号是相同的。然后现在我需要用python进行下述处理:
就是将相同id的字数相加得到一个总和sum,然后对sum进行如下的公式计算:
result=字数1/sumlog(字数1/sum)+字数2/sumlog(字数2/sum)+......
按这个文件举例来说,就是比如334555718的这个id的result计算如下:
sum=19+167
result=19/sumlog(19/sum)+167/sumlog(167/sum)
33455723的这个id的result就是
sum=21+147+50
result=21/sumlog(21/sum)+147/sumlog(147/sum)+50/sum*log(50/sum)
然后依次输出每个id的序号,id号跟result。
我的代码如下:
import math
f = open("F:\\net.txt")
lines = f.readlines()
rev_id=[]
for line in lines:
num = line.split()[0]
zishu = line.split()[2]
revid = line.split()[3]
sum = zishu
if revid in rev_id:
sum += zishu
result += zishu/sum*(math.log(zishu/sum))
rev_id.append(revid)
我的result的结果肯定不对,因为sum的值不是固定的全部总和。。请问该怎么做。
這邊是Python3的代碼,給你參考:
import math
dic = {}
# read file
with open('net.txt' , 'r') as reader:
for line in reader:
idx, num, revid = line.strip().split()
lst = dic.setdefault(revid, [])
lst.append(int(num))
results = {}
# calculate results
for revid, lst in dic.items():
s = sum(lst)
result = sum([num/s * math.log(num/s) for num in lst])
results.update({revid:result})
# output
for revid, result in results.items():
print(revid, result)
說明與建議:
Python 讀取檔案的確是使用 open
function,但是開啟了的檔案,必須記得關閉以免發生問題,像你給出的代碼中,文件被你 open
了卻沒有 close
,這是一種較不安全的寫法,應當緊記: 有 open
就有 close
,他們是成對的。 為了避免忘記關閉文件的可能,使用 with
述句是個理想的辦法。