为了账号安全,请及时绑定邮箱和手机立即绑定

使用临时内存进行智能计算

使用临时内存进行智能计算

largeQ 2021-03-19 14:11:09
我有一个代码,如果它们具有匹配的index [0],则需要遍历并总结索引x。什么是创建此的最佳解决方案?我想我可能有defaultdict,如果index [0]中有一个匹配项,它将添加这些值。有没有一种方法可以逐行读取它,并且将index [0]始终保留在临时内存中,如果它与下一个index [0]相匹配,它将进行总和?这是我到目前为止的内容:with open("test.txt") as f:    dic = defaultdict(list)    for line in f:        spl =line.split("\t")        if("Fam" in line):            dic[spl[0]].append(spl[1:])            a = float(spl[5])            b = float(spl[6])            sum = a * b            output = str(sum)            this = line.strip() + "\t"+output            if("TK" in line): #I would like to start sum up after this. Read all lines that include "TK", check index[0] for matches, if match sum up. 
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

我建议使用sth这样的:


with open('filename') as f:


   def lineValue(line):

     parts = line.split('\t')

     return float(parts[5]) * float(parts[6])


   def lineKey(line):

     parts = line.split('\t')

     return parts[0]


   for match, lines in groupby(

       line for line in f if "Fam" in line and "TK" in line,

       lineKey):

     yield sum(lineValue(line) for line in lines)

这种方式取决于所有匹配值已经彼此跟随的事实。如果不是这种情况,itertools.groupby()将无济于事。当然,两次分界并不是最优雅的解决方案。


如果匹配的行不会互相跟随,则您需要构建一个答案字典,然后defaultdict听起来很合理:


result = defaultdict(float)

with open('filename') as f:


   def lineValue(line):

     parts = line.split('\t')

     return float(parts[5]) * float(parts[6])


   def lineKey(line):

     parts = line.split('\t')

     return parts[0]


   for line in f:

     if "Fam" in line and "TK" in line:

       result[lineKey(line)] += lineValue(line)

再说一次,仅将生产线分开将是一个更优雅的解决方案。


查看完整回答
反对 回复 2021-03-27
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号