列表中项的数值计算

0 投票
4 回答
641 浏览
提问于 2025-04-16 22:21

我又来了,这次有个关于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 个回答

1

line.split() 会把一行文字分割成一个字符串列表。你可以试试 list[0] = float(list[0]) / 100000000

这个操作会把每个字符串转换成数字,这样在进行计算时就可以进行除法运算了。

5

首先,别把 list 当成变量名。每次这样做,就会有小猫咪死掉。

其次,你应该把从文件中提取出来的字符串转换成数字,最好用 Decimal,这样能保证精确度。现在你是在尝试用字符串去做除法。

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

第四,关闭文件的正确写法是 tFile.close(),而不是 close.tfile

第五,使用 for line in tfile: 来读取文件。文件描述符本身就是一个可以逐行读取的对象。

第六,使用 with open(transcriptionfile, "r") as tfile: 这样就不需要手动关闭文件了。

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./100 或者 10/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) )

撰写回答