python处理一个求和运算
黄舟
黄舟 2017-04-17 17:43:08
0
1
481

我现在有个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的值不是固定的全部总和。。请问该怎么做。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(1)
Peter_Zhu

Berikut ialah kod Python3 untuk rujukan anda:

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)
    

Arahan dan cadangan:

Python memang menggunakan fungsi open untuk membaca fail, tetapi jika anda membuka fail, anda mesti ingat untuk menutupnya untuk mengelakkan masalah Seperti dalam kod yang anda berikan, fail itu open tetapi tiada close. Ini adalah cara penulisan yang kurang selamat Anda harus ingat: di mana sahaja ada open, ada juga close, dan mereka berpasangan. Untuk mengelakkan kemungkinan terlupa untuk menutup fail, adalah sesuai untuk menggunakan pernyataan with.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan