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

如何在列表中无重复索引位置设置指定数量的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:20:54