簡體   English   中英

Python while循環問題

[英]Python while loop issues

Infile是一個家譜:

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

我想從infile中打印出每一代的時間,最后我想要平均值。 在這里,我認為我的問題是infile結束時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()

您可以使用以下語句遍歷文件的全部內容:

for line in infile:
    # Perform the rest of your steps here

您不希望使用while循環,除非您有某種計數器來切換索引位置(即,您使用了infile.readlines()並想使用while循環)。

在第二種情況下,您的代碼僅從文件中讀取一行。

更簡單的東西,例如:

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

嘗試這個:

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函數,第二次調用 main函數。

您可以嘗試如下操作:

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)。

這兩個腳本的問題在於while循環是無限的。 除非第一行為空,否則條件line != ''永遠不會為假。

您可以解決此問題,但最好使用Python習慣用法:

lastyear = None
ages = []
for line in infile:
    _name, year = line.split('\t')
    year = int(year)
    if lastyear:
        ages.append(year - lastyear)
    lastyear = year
print float(sum(ages))/len(ages)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM