Python while 循环问题

1 投票
5 回答
850 浏览
提问于 2025-04-17 10:16

输入文件是一个家谱:

holla   1755
ronaj   1781
asdflæj 1803
axle    1823
einar   1855
baelj   1881
æljlas  1903
jobbi   1923
gurri   1955
kolli   1981
Rounaj  2004

我想把每一代的时间都打印出来,最后还想算个平均值。我觉得我的问题在于,当输入文件结束时,line2 超出了范围:

def main():
    infile = open('infile.txt', 'r')
    line = infile.readline()
    tmpstr = line.split('\t')
    age=[]
    while line !='':
        line2 = infile.readline()
        tmpstr2 = line2.split('\t')
        age.append(int(tmpstr2[1]) - int(tmpstr[1]))
        print age
        tmpstr = tmpstr2
    infile.close()
    print sum(age)*1./len(age)
main()

所以我决定把所有信息读到一个列表里,但这里的 tmpstr 值没有改变:

def main():
    infile = open('infile.txt', 'r')
    line = infile.readline()
    age=[]
    while line !='':
        tmpstr = line.split('\t')
        age.append(tmpstr[1])
        print age
    infile.close()
    print sum(age)*1./len(age)
main()

这是为什么呢?这两个脚本有什么问题?为什么我要写两次 main()?有没有什么想法可以解决这两个问题?

谢谢大家,最后结果是这样的:

   def main():
        with open('infile.txt', 'r') as input:
            ages = []
            for line in input:
                data = line.split()
                age = int(data[1])
                ages.append(age)
            gentime = []
            for i in xrange(len(ages)-1):
                print ages[i+1] - ages[i]
                gentime.append(ages[i+1] - ages[i]) 
            print 'average gentime is', sum(gentime)*1./len(gentime)
    main()

相关问题:

5 个回答

1

在第二种情况下,你的代码只从文件中读取了一行。

可以用更简单的方式,比如:

age = []
with open('data.txt', 'rt') as f:
   for line in f:
      vals = line.split('\t')
      age.append(int(vals[1]))

print sum(age) / float(len(age))

这样会生成

1878.54545455
1

你可以试试这样的写法:

if __name__ == "__main__":
    file = open("infile.txt", "r")
    lines = file.readlines()
    gens = [int(x.split('\t')[1]) for line in lines]
    avg = sum(gens)/len(gens)

第一行是 Python 程序的入口,就像 C 语言里的 "int main()" 一样。

接下来,最简单的方式是把文件里的所有行都读进一个列表,这样方便后面的操作。

第四行是遍历文件的每一行,把每行按制表符分开,然后只取分开后列表里的第二个项目(也就是索引为 1 的那个)。

1

试试这个:

def main():
    with open('infile.txt', 'r') as input:
        ages, n = 0, 0
        for line in input:
            age = int(line.split()[1])
            ages += age
            n += 1
            print age
        print 'average:', float(ages) / n

一些评论:

  • 你不需要用列表来存储数字,几个本地变量就够了
  • 在这种情况下,使用 split() 不带参数是个好主意,这样你可以正确处理输入,当名字和前面的数字之间用空格 制表符分开时
  • 使用 with 语法来打开文件也是个好主意,这样可以确保文件在使用完后会被关闭

关于你问题的最后一部分,“为什么我要写两次 main()?”这是因为第一次你是在 定义 main 函数,第二次你是在 调用 它。

撰写回答