首页 > 解决方案 > 为什么替换不适用于此子字符串?

问题描述

我对 Python 完全陌生,所以我提前为糟糕的代码道歉。我正在尝试替换列表中字符串的子字符串,但返回的列表是相同的。在代码中,有一个帐户列表和用户给出的另一个交易列表,我应该检查命令是添加还是子,以添加到余额或从中减去。以下是两个列表的格式:

F1:
ACCOUNT NUMBER | PIN CODE | BALANCE
F2:
COMMAND | AMOUNT | ACCOUNT NUMBER | PIN CODE

这是我正在使用的代码:

import sys

F1 = sys.argv[1]
F2 = sys.argv[2]


def file_reader(filePath):
    file = open(filePath, 'r')
    data = file.read()
    file.close()
    return data


def splitter(str):
    return str.split()


def joiner(list):
    return '\n'.join(list)


def file_writer(filePath, str):
    file = open(filePath, 'w')
    file.write(str)


def make_transaction(accounts, transactions):
    for i in range(len(transactions)):
        # Check account number & pin
        if accounts[i][0:4] == transactions[i][9:13]:
            if accounts[i][5:9] == transactions[i][-4:]:
                # Check whether the user wants to add or subtract from balance
                if 'add' in transactions[i]:
                    balance = int(accounts[i][10:])
                    transaction = int(transactions[i][4:8])
                    balance += transaction
                    balanceStr = str(balance)
                    accounts[i].replace(accounts[i][10:], balanceStr)
                elif 'sub' in transactions[i]:
                    balance = int(accounts[i][10:])
                    transaction = int(transactions[i][4:8])
                    if balance > transaction:
                        balance -= transaction
                        balanceStr = str(balance)
                        accounts[i].replace(accounts[i][10:], balanceStr)
    return accounts


file1 = fileReader(F1)
file1Data = splitter(file1)
file2 = fileReader(F2)
file2Data = splitter(file2)

print(file1Data)
print(file2Data)
print(makeTransaction(file1Data, file2Data))

这是输出:

Program Failed for Input: /tmp/a1 /tmp/tx
Expected Output: 
Your Program Output: ['1000|1234|10000', '1020|2222|0', '3000|3344|1000', '2020|1234|90000']
['add|1000|1000|1234', 'sub|1000|1020|2222', 'sub|1000|3000|3344']
['1000|1234|10000', '1020|2222|0', '3000|3344|1000', '2020|1234|90000']

任何帮助,将不胜感激。谢谢你。

标签: python

解决方案


.replace对于您要解决的问题,这是有风险的用例。它使用模式匹配来进行更改,以防您的子字符串(即balance[10:]意外与balance[0:5]您匹配)会默默地得到非常不可预测的结果。

相反,我建议你更换

 accounts[i].replace(accounts[i][10:], balanceStr)

accounts[i] = accounts[i][0:9] + balanceStr

额外说明一下,假设您的输入数据被 分割|,您应该为您的输入数据创建数据持有者,而不是使用字符串,因为字符串是易变的,如果您的客户执行了非常大的交易,您的代码可能会开始出现不可预测的行为。

相反,我会做一些事情account_number, pin_code, balance = '1000|1234|10000'.split('|')并将数据加载到一个列表中,其中每一行代表一个帐户或一个交易。


推荐阅读