python - 为什么替换不适用于此子字符串?
问题描述
我对 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']
任何帮助,将不胜感激。谢谢你。
解决方案
.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('|')
并将数据加载到一个列表中,其中每一行代表一个帐户或一个交易。
推荐阅读
- ssis - 行被定向到 OutputError 时的 SSIS 电子邮件消息
- python - Matplotlib 固定子图高度
- python - 在无服务器架构(AWS Lambda)上从 python 代码连接到 MongoDB 的最佳方式是什么?
- python - 我在 ursina 第一人称控制器中做错了什么?
- python - 在机器学习(线性回归)中,在训练/测试过程中我得到了这个类型错误。有人可以帮我吗?
- python - 使用 PyMuPDF 进行 Python 文本注释
- arrays - 来自外部库的 python numba numpy 数组
- sql - SQL select根据状态顺序返回行的最高状态
- php - 通过 PHP 访问 MySQL 根本不起作用
- javascript - 如何在本机反应中从经纬度数组映射多个标记