如何在python中对列表中的特定值使用sum?

如何在python中对列表中的特定值使用sum?,python,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 # ...... 对于文件中的每一行

我有一个文本文件,看起来像这样;这些值以选项卡分隔:

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 

这不管用,我希望能得到一些建议

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

接下来,
sum()
是一个函数,但如果使用索引语法,
sum[…]
将引发异常。您也不需要使用列表理解来从切片中获取值,只要
sum(data[:3])
就可以了,只要切片生成一个
float
s序列

您有一个以制表符分隔的文件,可能最简单的方法是使用
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个值都是零;在这一点上,您将被零除,并且您希望处理针对该情况引发的异常。

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

接下来,
sum()
是一个函数,但如果使用索引语法,
sum[…]
将引发异常。您也不需要使用列表理解来从切片中获取值,只要
sum(data[:3])
就可以了,只要切片生成一个
float
s序列

您有一个以制表符分隔的文件,可能最简单的方法是使用
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个值都是零;在这一点上,您将被零除,并希望处理针对该情况引发的异常。

这是Python 2还是Python 3?您是否有最低版本要求?为什么尝试使用方括号调用
sum
函数?
sum
语法完全错误
[sum[for x in x data[0:3]]
应该是
sum(x for x in data[0:3])
,或者更确切地说是
sum(float(x)for x in data[0:3])
@tobias_k:鉴于
数据是
映射(float,…)
调用的结果,我不认为额外的
float()
转换是必要的:-P@MartijnPieters是的,我错过了那一行。这是Python2还是3?你有最低版本要求吗?为什么你要用方括号调用
sum
函数呢?
sum
语法完全错误。
[sum[for x in x data[0:3]
应该是
sum(x for x in data[0:3])
,或者更确切地说是
sum(数据[0:3]中x的float(x))
@tobias_k:鉴于
数据
映射(float…)
调用的结果,我不认为额外的
float()
转换是必要的:-P@MartijnPieters是的,我错过了那一行。谢谢-我正在努力查看解决方案中每行的前6个描述符列会发生什么情况?@AlexTrevylan放置一个
打印(行)
for
循环中调用以查看行的外观。
csv
读取器将行数据拆分为列。您可以从每一行中获取所需的列并附加计算出的平均值。然后,您可以使用
csv
写入器将更新的行数据写入新文件。@AlexTrevylan:在
中仍然存在,未被触及。您可以直接将它们与
行[:6]
一起使用。我只是不想对每行中的列数进行假设。谢谢-我正在努力查看解决方案中每行的前6个描述符列会发生什么情况?@AlexTrevylan放置
打印(行)
for
循环中调用以查看行的外观。
csv
读取器将行数据拆分为列。您可以从每一行中获取所需的列并附加计算出的平均值。然后,您可以使用
csv
写入器将更新的行数据写入新文件。@AlexTrevylan:在
中仍然存在,未被触及。您可以直接将它们与
行[:6]
一起使用。我只是不想假设每行中的列数。