如何在python中使用sum来获取列表中的特定值?

时间:2018-04-26 14:55:27

标签: python

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

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 

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

1 个答案:

答案 0 :(得分:3)

你没有显示cols来自哪里,但看起来你并没有实际拆分每一行,在这种情况下,你留下的是一个字符串而你正试图工作使用该字符串的字符,没有第一个字符6.将单个字符映射到浮点值不会为您提供所需的数据。

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

你有一个制表符分隔的文件,最简单的方法是使用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个值全部为零;那时你要除以零,并且你想要处理那种情况下引发的异常。