我需要创建一个更新元组列表中的元组的函数。元组包含事务,其特征是ammount,day和type。我做了这个函数应该完全替换一个新的元组,但是当我尝试打印更新的元组列表时,我得到了错误:
TypeError: tuple indices must be integers or slices, not str
代码:
def addtransaction(transactions, ammount, day, type):
newtransactions = {
"Ammount": ammount,
"Day": day,
"Type": type
}
transactions.append(newtransaction)
def show_addtransaction(transactions):
Ammount = float(input("Ammount: "))
Day = input("Day: ")
Type = input("Type: ")
addtransaction(transactions, ammount, day, type)
def show_all_transaction(transactions):
print()
for i, transaction in enumerate(transactions):
print("{0}. Transaction with the ammount of {1} on day {2} of type: {3}".format(
i + 1,
transaction['Ammount'], ; Here is where the error occurs.
transaction['Day'],
transaction['Type']))
def update_transaction(transactions): ; "transactions" is the list of tuples
x = input("Pick a transaction by index:")
a = float(input("Choose a new ammount:"))
b = input("Choose a new day:")
c = input("Choose a new type:")
i = x
transactions[int(i)] = (a, b, c)
addtransaction(transactions, 1, 2, service)
show_all_transaction(transactions)
update_transaction(transactions)
show_all_transaction(transactions)
答案 0 :(得分:2)
元组基本上只是list
,区别在于tuple
,如果不创建新的tuple
,则无法覆盖其中的值。
这意味着您只能通过从0开始的索引访问每个值,例如transactions[0][0]
。
但是看起来你应该首先使用dict
。因此,您需要重写update_transaction
以实际创建与dict
工作方式类似的addtransaction
。但是,不要将新事务添加到最后,而只需要覆盖给定索引处的事务。
这是update_transaction
已经执行的操作,但它会使用元组而不是dict
覆盖它。当你打印出来时,它无法处理并导致此错误。
原始答案(在我了解其他功能之前)
如果要将字符串用作索引,则需要使用dict
。或者,您可以使用namedtuple
,它们类似于元组,但它也具有每个值的属性以及您之前定义的名称。所以在你的情况下它会是这样的:
from collections import namedtuple
Transaction = namedtuple("Transaction", "amount day type")
用于创建Transaction
并用空格或逗号(或两者)分隔的字符串给出的名称。您只需调用该新对象即可创建事务。并通过索引或名称访问。
new_transaction = Transaction(the_amount, the_day, the_type)
print(new_transaction[0])
print(new_transaction.amount)
请注意,执行new_transaction["amount"]
仍然无效。
答案 1 :(得分:0)
这不是一个通用的答案,如果有人遇到同样的问题,我会提到它。
如前所述,元组由整数寻址,例如my_tuple[int]
或切片 my_tuple[int1:int2]
。
当我将代码从 Python2 移植到 Python3 时遇到了麻烦。原始代码使用了类似 my_tuple[int1/int2]
的东西,这在 Python2 中有效,因为除法 int/int 结果为 int。
在 Python3 中 int/int 结果是一个浮点数。
我必须将代码修复为 my_tuple[int1//int2]
才能获得 python2 行为。