Python字典列表用Getter函数报错:list indices must be integers or slices, not tuple
解决使用自定义Getter函数删除字典列表元素时的"list indices must be integers or slices, not tuple"错误
你需要删除字典列表中"day"值处于指定区间的元素,且想用自定义的get_transaction_day函数替代直接访问elem["day"],但运行时触发了"list indices must be integers or slices, not tuple"错误。
错误原因
这个错误通常是因为你错误地将列表+索引的元组传给了getter函数,或是getter的参数设计不符合使用场景——正确的getter应该接收单个字典元素,而非列表与索引的组合。
正确实现方案
第一步:定义正确的Getter函数
def get_transaction_day(transaction): return transaction["day"]
方式1:列表推导式(推荐,创建新列表)
逻辑清晰,不会因索引偏移出错:
lst = [{"day": 1, "sum": 25, "type": 'in'}, {"day": 2, "sum": 55, "type": 'in'}, {"day": 3, "sum": 154, "type": 'out'}, {"day": 4, "sum": 99, "type": 'in'}] def get_transaction_day(transaction): return transaction["day"] # 过滤掉day在1-3之间的元素 filtered_lst = [elem for elem in lst if not (1 <= get_transaction_day(elem) <= 3)] print(filtered_lst) # 输出:[{"day": 4, "sum": 99, "type": 'in'}]
方式2:原地删除(倒序遍历原列表)
若需修改原列表而非创建新列表,必须倒序遍历(避免元素删除后索引偏移):
lst = [{"day": 1, "sum": 25, "type": 'in'}, {"day": 2, "sum": 55, "type": 'in'}, {"day": 3, "sum": 154, "type": 'out'}, {"day": 4, "sum": 99, "type": 'in'}] def get_transaction_day(transaction): return transaction["day"] # 倒序遍历索引,防止删除元素后索引错乱 for i in range(len(lst)-1, -1, -1): day = get_transaction_day(lst[i]) if 1 <= day <= 3: del lst[i] print(lst) # 输出:[{"day": 4, "sum": 99, "type": 'in'}]
常见错误写法示例
如果你的getter设计成需要接收列表和索引,或是调用时错误传入了元组(比如enumerate返回的索引+元素组合),就会触发错误:
# 错误的Getter写法 def get_transaction_day(lst, idx): return lst[idx]["day"] # 错误的调用方式(传入了元组) # filtered_lst = [elem for elem in enumerate(lst) if not (1 <= get_transaction_day(elem) <=3)] # 此处elem是(索引, 元素)的元组,被当作第一个参数传给get_transaction_day后,会尝试用元组索引列表,触发错误
内容的提问来源于stack exchange,提问作者Sebastian Filipovici
相关产品推荐
相关产品推荐

