Python中如何给列表随机取值添加排除条件(仅使用randint)
解决方案
实现逻辑
要满足你的需求仅需两步,全程仅使用randint实现随机逻辑:
- 首先筛选出同时符合两个规则的合法索引:
- 索引小于列表长度减1(排除最后一个元素)
- 索引对应的列表元素值不等于0
- 再用
randint随机选取合法索引中的一个,完成取值
完整代码
方法1:预筛选合法索引(推荐,性能稳定)
import random our = [2, 3, 4, 0] # 生成所有符合条件的索引列表 valid_indexes = [i for i in range(len(our)-1) if our[i] != 0] # 仅用randint从合法索引中随机选取 random_pos = random.randint(0, len(valid_indexes)-1) random_index = valid_indexes[random_pos] random_number = our[random_index] print(random_number)
用你给出的测试用例[3, 3, 0, 3, 3, 7]验证,生成的valid_indexes为[0,1,3,4],完全符合要求。
可新增空值判断避免无合法元素时报错:
import random our = [2, 3, 4, 0] valid_indexes = [i for i in range(len(our)-1) if our[i] != 0] if valid_indexes: random_pos = random.randint(0, len(valid_indexes)-1) random_index = valid_indexes[random_pos] random_number = our[random_index] print(random_number) else: print("没有符合条件的元素可选")
方法2:拒绝采样(适合合法索引占比高的场景)
如果不想预先生成索引列表,也可以循环重试直到抽到符合条件的索引:
import random our = [3, 3, 0, 3, 3, 7] while True: random_index = random.randint(0, len(our)-2) # 符合条件就退出循环 if our[random_index] != 0: break random_number = our[random_index] print(random_number)
内容的提问来源于stack exchange,提问作者gladtobepart
相关产品推荐
相关产品推荐

