使用列表中的项目进行数值计算

时间:2011-07-27 08:27:57

标签: python

我又回来了另一个python查询。我一直试图用列表中的项目进行一些计算。这是代码:

import math

def Usage() :
    print "Usage :python beznew.py transcriptionsFile"

if __name__ == "__main__" :

    if len(sys.argv) != 2 : 
        Usage() 

    else :
        transcriptionFile = sys.argv[1]
        tFile = open(transcriptionFile, "r")

        for line in iter(tFile) :
            list = line.split()

            # changing the unit of time from 100 nano seconds to seconds
            list[0] = list[0] / 100000000
            list[1] = list[1] / 100000000

            # duration of each phoneme
            list = list[1] - list[0]

            # extracting the start time of each phoneme
            newlist = list.pop[0]    

            print list
            print newlist

        close.tFile 

输入文件如下所示:

000000 1200000 pau

1200000 1600000 dh

1600000 2000000 ih

2000000 3100000 k

3100000 3400000 aa

3400000 3800000 r

我正在尝试将数值更改为秒。并且还试图获得第一个和第二个数字之间的差异。它不允许我划分。我不明白我做错了什么。谢谢。

4 个答案:

答案 0 :(得分:5)

首先,不要将list用作变量名。每当你这样做,一只小猫就会死去。

其次,如果您重视精度,则应将从文件中提取的字符串转换为数字,最好是Decimal。目前你正试图划分一个字符串。

第三,纳秒是十亿分之一秒,而不是百万分之一。

第四,它是tFile.close(),而不是close.tfile

第五,使用for line in tfile:。文件描述符已经是迭代器。

第六,使用with open(transcriptionfile, "r") as tfile:并完成必须关闭它。

答案 1 :(得分:1)

line.split()返回字符串列表。试试list[0] = float(list[0]) / 100000000

在计算之前,这会将每个字符串转换为支持除法的数字。

答案 2 :(得分:1)

您可以按如下方式简化代码:

transcriptionFile = 'calculus.txt'

with open(transcriptionFile, "r") as tFile:
        for line in tFile :
                li = line.split()
                if li: 
                        new = ((int(li[1]) - int(li[0]))/10000000. , li[2])     
                        print li,'  ',new

条件if li:用于消除可能的空行。

重点:

  • 不要调用名为list的列表,因为list是Python内置函数的名称

  • 在Python中
  • 10/100产生0;你必须加点才能获得正确的结果:10./10010/100.

  • 在除以10000000之前进行微积分list = list[1] - list[0],它更精确

  • with open(....) as handle:最好打开文件

我个人会这样做

transcriptionFile = 'calculus.txt'

with open(transcriptionFile, "r") as tFile:
        gen = (line.split() for line in tFile if line.strip())
        li = [((int(t2)-int(t1))/10000000.,phon) for (t1,t2,phon) in gen]
        print '\n'.join(map(str,li))

请注意,我使用10000000来划分:如果1600000 - 1200000 = 400000的单位为100纳秒,则400000 / 10000000为0.04秒

编辑1

transcriptionFile = 'calculus.txt'

with open(transcriptionFile, "r") as tFile:
        gen = (line.split() for line in tFile if line.strip())
        firstVals, lapTimes = [],[]
        for (t1,t2,phon) in gen:
                firstVals.append( (int(t1)/10000000.,phon) )
                lapTimes.append( (int(t2)-int(t1))/10000000.,phon) )

答案 3 :(得分:0)

您不会将字符串转换为数字值。为了对您的数据进行数学运算,您必须将它们转换为intfloat个对象:

valueA = int(list[0]) / 100000000
valueB = int(list[1]) / 100000000