Python秘密竞拍程序报TypeError 列表索引误用字典 类型转换无效
报错触发根因
- 列表遍历逻辑完全错误:
for x in bidder_list语法中,变量x会依次被赋值为列表内存储的每一个元素,也就是你在add_new_bidder函数里append进去的各个竞拍人字典对象,不是列表的整数索引值。 - 后续代码用
bidder_list[x]["bidder_offer"]取值时,相当于把一个字典对象传入列表的方括号索引位。Python语法规定列表索引必须是整数或切片类型,因此直接抛出TypeError: list indices must be integers or slices, not dict的报错,和你之前做的出价数值类型转换没有任何关联。
代码附带的隐性问题
- 赢家判定逻辑存在冗余和缺失:原代码在判断当前出价比当前最高出价更高时,重复两次给
winner_bid变量赋值,且完全没有记录最高出价对应的竞拍人姓名,最后只能输出最高出价数值,无法完成“找出赢家”的核心功能。 - 存在冗余的类型转换:你在获取用户输入的出价时,已经通过
int(input(...))把出价转为整数存入了竞拍人字典中,后续循环取值时不需要再额外套一层int()做转换。
修复方案
- 修正列表遍历的取值逻辑,二选一即可:
- 直接遍历列表中的每个竞拍人字典对象,不需要再嵌套列表索引取值:
# 原错误写法:x是字典,拿来当列表索引 # for x in bidder_list: # bidder_list[x]["bidder_offer"] # 正确写法1:直接拿遍历到的字典取值 for bidder in bidder_list: current_bid = bidder["bidder_offer"] - 如果需要通过索引遍历列表,要先取到从0开始的整数索引值再做取值:
# 正确写法2:通过索引遍历 for x in range(len(bidder_list)): current_bid = bidder_list[x]["bidder_offer"]
- 直接遍历列表中的每个竞拍人字典对象,不需要再嵌套列表索引取值:
- 补全赢家记录逻辑,删掉冗余赋值代码,修复后的
the_winnner_goes_to函数完整代码如下:def the_winnner_goes_to(): winner_bid = 0 winner_name = "" for bidder in bidder_list: current_bid = bidder["bidder_offer"] if current_bid > winner_bid: winner_bid = current_bid winner_name = bidder["bidder_name"] print(f"竞拍赢家是 {winner_name},最终出价为 ${winner_bid}")
内容的提问来源于stack exchange,提问作者Penguin Learning
相关产品推荐
相关产品推荐

