为什么替换不适用于此子字符串?

2024-09-30 04:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python完全不熟悉,因此我为错误的代码提前道歉。我试图替换列表中字符串的子字符串,但返回的列表是相同的。在代码中,有一个帐户列表和用户提供的另一个事务列表,我应该检查命令是add还是sub,以添加到余额还是从中减去。以下是两个列表的格式:

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']

任何帮助都将不胜感激。多谢各位


Tags: 代码add列表returnifdeffileint
2条回答

.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('|')的思路做一些事情,并将数据加载到一个列表中,其中每一行表示一个帐户或一个事务

这应该完全重写:

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

例如,我宁愿这样做:

def make_transaction(accounts, transactions) :
    for a,t in zip(accounts, transactions) :
        a_num, a_pin, a_balance = a.split('|')
        t_command, t_amount, t_num, t_pin = t.split('|')
        if a_num == t_num and a_pin == t_pin :
            if t_command == 'add' :
                # do your stuff
            elif t_command == 'sub' :
                # do something else

等等。。。使用索引处理字符串是非常错误的

相关问题 更多 >

    热门问题