如何在列表中无重复索引位置设置指定数量的1?
解决列表随机设置不重复索引为1的问题
嗨,我来帮你搞定这个问题~你的代码目前有两个小问题:一是随机生成的索引可能重复,导致最终列表里1的数量少于4个;二是random.randint(0, n_cells)会生成到n_cells这个值,而列表的最大索引是n_cells-1,运行时会触发索引越界错误!
下面给你两种靠谱的修正方案:
方案1:用random.sample(推荐,简洁高效)
random.sample()是Python标准库专门用来从序列中选取不重复元素的方法,完全适配你的需求:
import random def init_positions(n_cells, n_veh): lst = [0] * n_cells # 从0到n_cells-1的范围内,随机选n_veh个不重复的索引 selected_indices = random.sample(range(n_cells), n_veh) for idx in selected_indices: lst[idx] = 1 return lst position = init_positions(10, 4) print(position)
为什么这能解决问题?
random.sample()会自动确保选中的索引没有重复,不需要手动判断;range(n_cells)生成的是0到n_cells-1的整数序列,完美匹配列表的合法索引范围,彻底避免越界问题。
方案2:手动去重(适合理解底层逻辑)
如果你想手动实现去重逻辑,可以用集合来记录已经用过的索引,直到选够指定数量的不重复索引:
import random def init_positions(n_cells, n_veh): lst = [0] * n_cells used_indices = set() # 直到选够n_veh个不重复的索引 while len(used_indices) < n_veh: # 生成合法范围内的索引(0到n_cells-1) idx = random.randint(0, n_cells - 1) if idx not in used_indices: used_indices.add(idx) lst[idx] = 1 return lst position = init_positions(10, 4) print(position)
注意点:
这里一定要把randint的上限改成n_cells-1,不然会出现索引越界的错误。不过这种方法在n_veh接近n_cells时,重复生成相同索引的概率会变高,效率不如random.sample。
内容的提问来源于stack exchange,提问作者Keegan Husom
相关产品推荐
相关产品推荐

