如何按设定频率仅对列表指定索引位置的元素进行随机替换
解决方案
错误原因说明
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
相关产品推荐
相关产品推荐

