使用random.choice()选取列表元素触发IndexError的解决方法
解决
random.choice()抛出IndexError: list index out of range的问题 错误原因
random.choice()要求传入非空序列,你遇到的报错是因为emails_list和emails_list2都是空列表,没有任何元素可供随机选择。
代码中的问题点
- 收集用户数据时,仅将姓名和邮箱存入了
original_dict,但从未向names_list和emails_list中添加元素,导致这两个列表始终为空。 emails_list2 = emails_list是引用赋值,两个变量指向同一个空列表,自然也没有内容。- 遍历
names_list的循环因列表为空完全不执行,assigned_dict无法生成数据。
修复后的代码
import random names_list = [] emails_list = [] original_dict = {} assigned_dict = {} # ------------------------ Saving Data -------------------------- # while True: name = str(input("Enter your name: ")) if name == "e": break email = str(input(f"Enter {name}'s email: ")) if email == "e": break # 同步填充列表和字典 names_list.append(name) emails_list.append(email) original_dict[name] = email # ------------------------ Assigning Data -------------------------- # # 复制邮箱列表,避免修改原列表(可选,根据需求调整) emails_list2 = emails_list.copy() for each_name in names_list: # 确保列表非空再进行随机选择 if not emails_list2: break chosen_email = random.choice(emails_list2) assigned_dict[each_name] = chosen_email # 可选:避免重复分配同一个邮箱(Secret Santa场景下常用) emails_list2.remove(chosen_email) print(names_list) print(emails_list) print(random.choice(emails_list)) # 现在不会报错 print(original_dict) print(assigned_dict)
关键改动说明
- 在数据收集阶段,添加
names_list.append(name)和emails_list.append(email),将输入的姓名和邮箱存入对应的列表。 - 使用
emails_list.copy()创建邮箱列表的副本,避免后续修改影响原列表(如果不需要保留原列表,也可以直接用原列表)。 - 增加了
if not emails_list2: break的判断,防止循环中列表被取空后继续调用random.choice()。 - 可选添加
emails_list2.remove(chosen_email),确保每个邮箱只被分配一次,符合Secret Santa的核心逻辑。
内容的提问来源于stack exchange,提问作者Kanishka Negi
相关产品推荐
相关产品推荐

