Так близко, но я не могу понять, что не так

Я прохожу курс в школе и у меня есть эта задача на Codio:

Для вашего последнего испытания в этом модуле вы загрузите два файла:
Первый файл F1 будет содержать информацию о некоторых учетных записях. Он будет разделен вертикальной чертой и будет иметь одну запись в строке со следующими полями:

ACCOUNT NUMBER | PIN CODE | BALANCE

Второй файл F2 будет содержать инструкции: по одной на каждой строке. Инструкция будет выглядеть так:

COMMAND | AMOUNT | ACCOUNT NUMBER | PIN CODE

COMMAND будет добавлено или добавлено. Если команда add, вы добавите СУММУ к БАЛАНСУ в файлах аккаунта F1. Если команда суб, вы будете вычитать.

Однако существует ряд причин, по которым вам может потребоваться отклонить транзакцию. Если вас попросят вычесть сумму, которая поставит счет ниже нуля, или если предоставленный вам пин-код не совпадает с пин-кодом в записи учетной записи, транзакция будет проигнорирована.

Транзакции по учетным записям Учитывая файлы F1 и F2, разделенные вертикальной чертой, где F1 содержит учетные записи с полями ACCOUNT NUM|PIN|BALANCE, а F2 содержит инструкции по транзакциям COMMAND|AMOUNT|ACCOUNT NUM|PIN, выполнять транзакции, сохраняя результаты обратно в F1.

Поле COMMAND будет добавлено или добавлено, указывая на добавление или вычитание из учетной записи.

Транзакции, которые не предоставляют правильный PIN-код или пытаются понизить счет ниже нуля, должны быть проигнорированы.

Это мой код для задачи:

records = []

with open(F1,'r') as account_info:
  content = account_info.readlines()
  for row in content:
    recordList = row.strip("\n").split('|')
    records.append(recordList)

records2 = []
with open(F2,'r') as user_input:
  content2 = user_input.readlines()
  for row in content2:
    recordList2 = row.strip("\n").split('|')
    records2.append(recordList2)

for i in range(len(records)):
  row = records[i]
for i in range(len(records2)):
  row = records2[i]

for row in records and records2:
  if records[i][1] == records2[i][3] and records2[i][0] == "add":
    newBalance = int(records[i][2]) + int(records2[i][1])
    records[i][2] = str(newBalance)
  elif records2[i][0] == "sub" and int(records[i][2]) >= int(records2[i][1]):
    newBalance = int(records[i][2]) - int(records2[i][1])
    records[i][2] = str(newBalance)


output_records = ""
i = 0
while i <= len(records):
  output_records += '|'.join(records[i])
  if i != len(records):
    output_records += '\n'
    i += 1
    if i == len(records):
      break

outputFile = open(F1, 'w')
outputFile.write(output_records)
outputFile.close

Это то, что я получаю для вывода, который отключен на одно число.

Your program output did not match the expected output.

Your output:
1000|1234|10000
1020|2222|0
3000|3344|0
2020|1234|90000

Expected output:

1000|1234|11000
1020|2222|0
3000|3344|0
2020|1234|90000

Может ли кто-нибудь указать мне направление, в котором я ошибаюсь? Спасибо.


person Michael Cedotal    schedule 07.06.2020    source источник
comment
Если вас попросят вычесть сумму, которая поставит счет ниже нуля, или если предоставленный вам пин-код не совпадает с пин-кодом в записи учетной записи, транзакция будет проигнорирована.   -  person Jack O'neill    schedule 08.06.2020
comment
Не похоже, что вы обрабатываете эти условия в показанном коде.   -  person Jack O'neill    schedule 08.06.2020
comment
Я теряюсь в том, что делать, чтобы выполнить другие условия.   -  person Michael Cedotal    schedule 08.06.2020
comment
Не могли бы вы предоставить входные данные для двух файлов для вывода, который вы получаете?   -  person DarrylG    schedule 08.06.2020
comment
Нам не даются исходные данные. Он уже указан в файлах.   -  person Michael Cedotal    schedule 08.06.2020
comment
У вас нет доступа даже к простым наборам данных (т. е. файловым данным) для экспериментов? Я не знаком с Codio, но другие платформы предоставляют доступ к простым наборам данных, чтобы вы могли поэкспериментировать с кодом, а затем, когда вы будете готовы, предоставить для тестирования более сложные наборы данных, к которым у вас нет доступа.   -  person DarrylG    schedule 08.06.2020
comment
Кодио - самое худшее. Мне говорили об этом многочисленные люди, прошедшие этот курс, и другие программисты. К счастью, это единственный курс, в котором используется Codio.   -  person Michael Cedotal    schedule 08.06.2020
comment
@MichaelCedotal - сумма и баланс всегда являются целыми или могут быть с плавающей запятой?   -  person DarrylG    schedule 08.06.2020
comment
Привет и добро пожаловать в Stack Overflow. Пожалуйста, выберите описательный заголовок, который объясняет (кратко), о чем ваш вопрос.   -  person Itamar Mushkin    schedule 08.06.2020
comment
Если вы не можете получить доступ к своим данным, можете ли вы их распечатать? только print(records) после того, как вы закончите читать (и print(records2) тоже)?   -  person Itamar Mushkin    schedule 08.06.2020


Ответы (3)


Предположим, что сумма и баланс имеют целочисленное значение.

Для изменения с плавающей запятой in(...) на float(...) в коде

Код

# Get Records
with open('file1.txt','r') as f1:
  records = []
  for row in f1:
    row = row.rstrip().split('|')
    # Strip white space and convert balance to float
    row = [x.strip() if i != 2 else int(x.strip()) for i, x in enumerate(row)]
    records.append(row)

# Get Transactions
with open('file2.txt', 'r') as f2:
  transactions = []
  for row in f2:
    row = row.rstrip().split('|')
    # Strip whitespace and convert balance to float
    row = [x.strip() if i != 1 else int(x.strip()) for i, x in enumerate(row)]
    transactions.append(row)

# Perform Transactions
for t in transactions:
  for record in records:
    # check records for matching account & pin
    # Brute force search -- okay for records and transactions only in thousands
    if t[2:] == record[:2]: 
      # Found account to update (record account & pin matches transaction)
      if t[0] =='add':
        record[-1] += t[1]  # increment balance
      elif t[0] == 'sub':
        if record[-1] - t[1] >= 0:
          record[-1] -= t[1]  # decrement balance
      break

# Output updated records
with open('file1.txt', 'w') as f3:
  for row in records:
    row = [str(x) for x in row]
    f3.write(' | '.join(row) + '\n')

Тест

Перед запуском

File1.txt
1000 | 1234 | 10000
1020 | 2222 | 2500
3000 | 3344 | 3000
2020 | 1234 | 95000

File2.txt
add    | 1000    | 1000 | 1234
sub    | 1000    | 1020 | 2222
add    | 1000    | 3000 | 3344
sub    | 1000    | 2020 | 1234

После запуска

File1.txt
1000 | 1234 | 11000
1020 | 2222 | 1500
3000 | 3344 | 4000
2020 | 1234 | 94000
person DarrylG    schedule 07.06.2020

Я думаю, что проблема может исходить из этого:

for row in records and records2:
  if records[i][1] == records2[i][3] and records2[i][0] == "add":
    newBalance = int(records[i][2]) + int(records2[i][1])
    records[i][2] = str(newBalance)
  elif records2[i][0] == "sub" and int(records[i][2]) >= int(records2[i][1]):
    newBalance = int(records[i][2]) - int(records2[i][1])
    records[i][2] = str(newBalance)

Из того, что я вижу, если records[i][1] != records2[i][3], то все равно запустить elif и вычесть.

person Trung Anh Phạm    schedule 07.06.2020

Ваш код действительно грязный, я могу посоветовать вам удалить все и перезапустить с пустого файла:

следующие строки бессмысленны:

for row in records and records2:


for i in range(len(records)):
   row = records[i]
for i in range(len(records2)):
   row = records2[i]

Если вы умеете пользоваться словарями, они могут немного помочь:

Здесь есть некоторый псевдокод возможного типа решения:

accounts = {}
with open(F1,'r') as f:
    for line in f:
        acc, pin, balance = line.split('|')
        accounts[acc] = {'pin': pin, 'balance': int(balance)}


with open(F2,'r') as f:
    for line in f:
        command, amount, acc, pin = line.split('|')
        amount = int(amount)
        if accounts[acc]['pin'] != pin:
            continue # wrong pin
        if command == 'add':
            accounts[acc]['balance'] += amount
        elif accounts[acc]['balance'] >= amount: # if there is enough balance to sub
            accounts[acc]['balance'] -= amount
person Hoxha Alban    schedule 07.06.2020