列表中项的数值计算
我又来了,这次有个关于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 个回答
line.split()
会把一行文字分割成一个字符串列表。你可以试试 list[0] = float(list[0]) / 100000000
。
这个操作会把每个字符串转换成数字,这样在进行计算时就可以进行除法运算了。
首先,别把 list
当成变量名。每次这样做,就会有小猫咪死掉。
其次,你应该把从文件中提取出来的字符串转换成数字,最好用 Decimal
,这样能保证精确度。现在你是在尝试用字符串去做除法。
第三,纳秒是秒的十亿分之一,而不是百万分之一。
第四,关闭文件的正确写法是 tFile.close()
,而不是 close.tfile
。
第五,使用 for line in tfile:
来读取文件。文件描述符本身就是一个可以逐行读取的对象。
第六,使用 with open(transcriptionfile, "r") as tfile:
这样就不需要手动关闭文件了。
你可以把你的代码简化成这样:
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) )