Python生成随机字符串时调用random.choice()报IndexError如何解决
错误原因
- 你调用
random.choice()时传入的consonants列表已经为空,所以触发索引越界报错 - 你直接修改全局的辅音列表,每次生成单词都会永久删除辅音元素:你要生成20个单词,每个单词需要2个辅音,累计需要40个辅音,而你初始化的辅音列表总共只有31个元素,遍历到后半段必然会出现空列表的情况
- 额外的逻辑错误:你要求的规则是单个单词内辅音不重复,而非所有生成的单词共用辅音池不能重复,当前写法完全不符合需求;且你选中一个辅音后会删除列表中所有相同的辅音,比如选中一次
v就把4个v全删,会更快耗尽辅音池
修复方案
你只需要每次生成新单词时,基于原始辅音列表做临时操作即可,不要修改全局列表,推荐两种实现方式:
方式1:最小改动适配你的原有逻辑
import random vowels = 'aeiouy' # 全局辅音列表只做原始模板,永远不修改 raw_consonants = ['b','c','d','f','g','h','j','k','l','m','m','n','p','q','q','r','s','t','v','v','v','v','w','x','x','x','x','z','z','z','z'] for num in range(20): # 每次生成单词都重新拷贝一份原始辅音列表,用完就丢 consonants = raw_consonants.copy() i = random.choice(consonants) word = i # 只删除选中的1个辅音,不是所有匹配项 consonants.remove(i) word += random.choice(vowels) i2 = random.choice(consonants) word += i2 consonants.remove(i2) word += random.choice(vowels) # 输出生成的单词 print(word)
方式2:更简洁的写法,用random.sample直接取不重复辅音
import random vowels = 'aeiouy' # 直接用去重后的辅音列表即可,sample会自动取不重复元素 consonants = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z'] for _ in range(20): # 直接取2个不重复的辅音,不用手动删元素 c1, c2 = random.sample(consonants, 2) v1, v2 = random.choices(vowels, k=2) word = f"{c1}{v1}{c2}{v2}" print(word)
内容的提问来源于stack exchange,提问作者qwerteee123
相关产品推荐
相关产品推荐

