1 回答

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)
再说一次,仅将生产线分开将是一个更优雅的解决方案。
添加回答
举报