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

如何按设定频率仅对列表指定索引位置的元素进行随机替换

解决方案

错误原因说明

Python 原生列表不支持直接传入列表作为索引批量取值,因此geno[M]会触发TypeError: list indices must be integers or slices, not list报错,无需通过拆分再拼接的复杂逻辑实现需求,仅需调整原有替换函数的取样范围即可。

完整可运行代码

import random

vals = ["*"]
def replace_random_specified(lst, min_n, max_n, replacements, allowed_indexes):
    # 随机生成本次要替换的元素数量
    n = random.randint(min_n, max_n)
    if n == 0 or not allowed_indexes:
        return lst.copy()
    # 仅从指定的索引列表中抽取要替换的位置
    replace_pos = set(random.sample(allowed_indexes, min(n, len(allowed_indexes))))
    return [
        random.choice(replacements) if idx in replace_pos else val
        for idx, val in enumerate(lst)
    ]

# 此处填写你需要执行替换的geno部分的索引(从0开始计数)
# 示例中替换原geno的第2、4个元素对应索引1、3
M = [1, 3]
with open("test2.txt", "w", encoding="utf-8") as out, open("test.txt", "r", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        tabs = line.split()
        # 保留第一列标识
        id_col = tabs[0]
        geno = tabs[1:]
        # 仅对指定索引位置执行随机替换
        new_geno = replace_random_specified(geno, 0, 1, vals, M)
        # 拼接后写入文件,分隔符用制表符
        out.write("\t".join([id_col] + new_geno) + "\n")

代码说明

  • 新增allowed_indexes参数接收指定要替换的索引列表,随机取样仅从该列表内选取位置,其余索引的元素会完全保留原值
  • 增加了边界判断,当替换数量为0或指定索引列表为空时直接返回原列表副本,避免报错
  • 代码默认按空格分割行内容,如果你的输入文件是严格的制表符分隔,可将line.split()改为line.split("\t")
  • 索引为0起始计数,如果你要指定整行的第2、4列进行替换,对应geno部分的索引为1、3,和示例配置一致

内容的提问来源于stack exchange,提问作者neuron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:54:04