[英]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.