TypeError:元组索引必须是整数或切片,而不是str

时间:2016-10-28 15:56:08

标签: python

我需要创建一个更新元组列表中的元组的函数。元组包含事务,其特征是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)

2 个答案:

答案 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 行为。