繁体   English   中英

为什么 split 和 readlines 会中断循环?

[英]Why split and readlines break for loop?

在我们的 Python 课程中,我们遇到了这个问题。 我们需要从文件中获取帐户数据,执行一些操作,然后 output 得到结果……我尝试使用帐户的第一个值作为初始最小值。 它不工作。 它做了一些我不知道的事情,只是关闭了整个for循环。

accounts.txt是一个存储 ID、储蓄类型和价值的文件。 例如,

66096   d   873323
29615   c   849977
45387   s   186640
95384   c   933363
13615   c   733321
46396   c   714610
17428   s   833671
43730   d   308296
92061   c   670423
51798   c   156063
58083   s   940510

所以,这里是代码:

file=open('accounts.txt',mode='r')
linep=file.readlines()
mins=linep[0].split()[2]
sumc=0
maxc=0
sums=0
sumd=0
avrd=0
cntr=0
for i in file:
    if i.split()[1]=='c':
        sumc+=int(i.split()[2])
        if int(i.split()[2])>=maxc:
            maxc=int(i.split()[2])
    elif i.split()[1]=='s':
        sums+=int(i.split()[2])
        if int(i.split()[2])<=mins:
            mins=int(i.split()[2])
    elif i.split()[1]=='d':
        sumd+=int(i.split()[2])
        cntr+=1
avrd=sums/cntr
print('The sum of all checking accounts is:',sumc)
print('The sum of all saving accounts is:',sums)
print('The sum of all deposit accounts is:',sumd)
print('The maximum balance for all checking accounts is:',maxc)
print('The minimum balance for all savings accounts is:',mins)
print('The average balance for all deposit accounts is:',avrd)

当您设置mins=99999999999时它可以工作,但我认为这不是一个好的解决方案。

那么,output 应该是这样的:

The sum of all checking accounts is: 209315463
The sum of all saving accounts is: 50272914
The sum of all deposit accounts is: 19976046
The maximum balance for all checking accounts is: 998992
The minimum balance for all savings accounts is: 150
The average balance for all deposit accounts is: 554890.1666666666

但是第二行和第三行把一切都搞砸了,所以我有这个

The sum of all checking accounts is: 0
The sum of all saving accounts is: 0
The sum of all deposit accounts is: 0
The maximum balance for all checking accounts is: 0
The minimum balance for all savings accounts is: 873323

所以你怎么看? 我知道,你可以使用最小值和最大值,但那是我们正在谈论的大学。 他们想这样做。

更正代码的最小更改

file=open('accounts.txt',mode='r')
linep=file.readlines()
mins=int(linep[0].split()[2])  # Need to make int
sumc=0
maxc=0
sums=0
sumd=0
avrd=0
cntr=0
for i in linep:  # need to loop over linep not file
    if i.split()[1]=='c':
        sumc+=int(i.split()[2])
        if int(i.split()[2])>=maxc:
            maxc=int(i.split()[2])
    elif i.split()[1]=='s':
        sums+=int(i.split()[2])
        if int(i.split()[2])<=mins:
            mins=int(i.split()[2])
    elif i.split()[1]=='d':
        sumd+=int(i.split()[2])
        cntr+=1
avrd=sums/cntr
print('The sum of all checking accounts is:',sumc)
print('The sum of all saving accounts is:',sums)
print('The sum of all deposit accounts is:',sumd)
print('The maximum balance for all checking accounts is:',maxc)
print('The minimum balance for all savings accounts is:',mins)
print('The average balance for all deposit accounts is:',avrd)

代码重构(更简单、更高效)

file=open('accounts.txt',mode='r')
linep=file.readlines()
data = [x.split() for x in linep]
checking = [int(x[2]) for x in data if x[1] == 'c']
savings = [int(x[2]) for x in data if x[1] == 's']
deposits = [int(x[2]) for x in data if x[1] == 'd']
sumc, sums, sumd = sum(checking), sum(savings), sum(deposits)
maxc, mins, avrd = max(checking), min(savings), sum(deposits)/len(deposits)
print('The sum of all checking accounts is:',sumc)
print('The sum of all saving accounts is:',sums)
print('The sum of all deposit accounts is:',sumd)
print('The maximum balance for all checking accounts is:',maxc)
print('The minimum balance for all savings accounts is:',mins)
print('The average balance for all deposit accounts is:',avrd)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM