You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用random.choice()选取列表元素触发IndexError的解决方法

解决random.choice()抛出IndexError: list index out of range的问题

错误原因

random.choice()要求传入非空序列,你遇到的报错是因为emails_list和emails_list2都是空列表,没有任何元素可供随机选择。

代码中的问题点

  1. 收集用户数据时,仅将姓名和邮箱存入了original_dict,但从未向names_list和emails_list中添加元素,导致这两个列表始终为空。
  2. emails_list2 = emails_list是引用赋值,两个变量指向同一个空列表,自然也没有内容。
  3. 遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:46:17