Python 使用临时内存进行智能计算
我有一个代码,我需要遍历所有行,并将索引x求和,如果它们有匹配的索引[0]。创建此功能的最佳解决方案是什么?我想我可以使用defaultdict,如果索引[0]中有匹配项,它会添加值。有没有一种方法可以让我逐行读取它,让索引[0]始终处于临时内存中,如果它与下一个索引[0]匹配,它将进行求和 这就是我到目前为止所做的:Python 使用临时内存进行智能计算,python,Python,我有一个代码,我需要遍历所有行,并将索引x求和,如果它们有匹配的索引[0]。创建此功能的最佳解决方案是什么?我想我可以使用defaultdict,如果索引[0]中有匹配项,它会添加值。有没有一种方法可以让我逐行读取它,让索引[0]始终处于临时内存中,如果它与下一个索引[0]匹配,它将进行求和 这就是我到目前为止所做的: with open("test.txt") as f: dic = defaultdict(list) for line in f: spl =l
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.
编辑。我正在对已排序的列表执行此操作
提前谢谢
编辑2。由于人们对我的理解有困难,也许一些输出会有所帮助。
当前变量此
打印:
Fam_c1_1 F Extractions 02-0419 02-419TK 500 400 200000.0
Fam_c1_1 F Extractions 5107 5107TK 1475 447.5 660062.5
Fam_c10_1 F Extractions 5132 5132TK 1555 547.6 851518.0
Fam_c100_1 M Extractions 5843 5843TK 2605 398.6 1038353.0
Fam_c1000_1 F Extractions 9913 9913TK 1900 398 756200.0
Fam_c1001_1 F Extractions 9512 9512TK 1050 20 21000.0
因此,在本例中,我希望我的代码遍历列表,始终在内存中保留列表的第一个值。如果它与下一行的第一个值相匹配,它将是x。我建议使用这样的东西:
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()
将无济于事。当然,将线拆分两次并不是最优雅的解决方案
如果匹配行彼此不一致,则需要构建一个答案的dict,然后一个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)
同样,只拆分一次行将是一个更优雅的解决方案。。。什么是索引[0]?它不会显示在您的代码中。你的意思是
行[0]
?也许你可以给出一些你想做的事情的例子,因为问题不清楚。是的,我指的是拆分后的第一个索引,所以在本例中是第[0]行。我所说的临时内存是指有一个临时内存,我可以让第一个索引值一直处于“浮动”状态。我不知道OP在问什么,但我很确定这不能回答这个问题。除非问题得到澄清,否则回答这个问题没有多大意义。我觉得他的代码中有一些问题我已经可以解决了。也许你是对的,这不会帮助他走完全程。这
目前在那里没有任何作用。通过匹配索引[0]
我指的正是groupby所做的事情,但我希望有更优雅的方法来做到这一点,这样我就可以动态地读/写/总结,而不是创建庞大的列表。itertools.groupby()
只是迭代,不生成列表。我将把它添加到我的答案中……还编辑了我的问题,以便人们更好地理解我:)