首页 > 解决方案 > 如何在 python 中将 sum 用于列表中的特定值?

问题描述

我有一个看起来像这样的文本文件;这些值是制表符分隔的:

diamond orange pear loc1  .  +    0.0  0.0  0.0  0.0  1.0 1.2  3.4 
diamond orange pear loc2  .  +    1.0  0.0  0.0  0.0  1.0 1.2  2.3
diamond orange pear loc3  .  +    2.0  0.0  3.0  0.0  0.0 0.0  1.4  
# ......

对于文件中的每一行,我想计算前 3 个值的总和除以后 4 个值的总和的比率。输出如下所示:

diamond orange pear loc1  .  +    0 
diamond orange pear loc2  .  +    0.22
diamond orange pear loc3  .  +    4.28 
 ......

我想在python中做到这一点。

with open('/path/to/file/') as inFile:
    inFile.next()
    for line in inFile:
        data = cols[6:]
        data = map(float,data)

        sum_3 = [sum[for x in x data[0:3]]
        sum_last = [sum[for x in x data[4:7]]
        average = sum_3/sum_last 

这不起作用,我希望我能得到一些建议吗?

标签: python

解决方案


您没有显示cols来自哪里,但似乎您实际上并没有拆分每一行,在这种情况下,您只剩下一个字符串,并且您试图使用该字符串的字符,而没有前 6 个。将单个字符映射到浮点值不会为您提供所需的数据。

接下来,sum()是一个函数,但是你使用的是索引语法,sum[...]会抛出异常。您也不需要使用列表推导从切片中获取值sum(data[:3]),只要切片产生floats 序列即可。

您有一个制表符分隔的文件,使用csv模块进行拆分可能是最简单的:

import csv

with open('/path/to/file/') as infile:
    reader = csv.reader(infile, delimiter='\t')
    next(reader)  # skip first row

    for row in reader:
        first3, last = row[-7:-4], row[-4:]
        try:
            average = sum(map(float, first3)) / sum(map(float, last))
        except ZeroDivisionError:
            # last four values are all zero; just set the average to zero.
            average = 0

我已经考虑到最后 4 个值都为零;那时你会被零除,你会想要处理为这种情况引发的异常。


推荐阅读