Зачем разбивать и читать строки ломать за цикл? - PullRequest
0 голосов
/ 19 сентября 2019

В нашем курсе Python нам дали эту проблему.Нам нужно получить данные об учетных записях из файла, выполнить некоторые манипуляции и вывести результаты ... Я попытался использовать первое значение учетной записи в качестве начального минимума.Это не работает.Он делает что-то, чего я не знаю, и просто отключает весь цикл for.

accounts.txt - это файл, в котором хранятся идентификатор, тип сбережений и стоимость.Например,

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, но я не думаю, что это хорошее решение.

Что ж, вывод должен был выглядеть следующим образом:

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

Но 2-я и 3-я строки все испортили, так что у меня есть

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

Итак, что же делатьдумаешь?Я знаю, вы можете использовать мин и макс, но мы говорим об этом колледже.Они хотят сделать это таким образом.

1 Ответ

0 голосов
/ 19 сентября 2019

Минимальные изменения для исправления вашего кода

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...