如何在for循环中从列表获取不重复随机值,避免prompt重复?
解决方案
核心思路
要避免同一Tag下的fintag重复,关键是按Tag维护一个动态的可用值池,每次分配后从对应池里移除已用值,后续同Tag的Name就不会抽到重复值,同时适配动态变化的列数。
修复后的代码实现
步骤1:预处理数据,构建Tag可用值池
先把字典数据转换成按Tag存储的可修改列表,避免每次循环重复读取原数据:
import pandas as pd import random # 读取CSV数据 people = pd.read_csv("people.csv") dic = pd.read_csv("dic.csv") # 为每个Tag创建独立的可用值列表副本(防止修改原数据) tag_value_pool = {} for tag in dic.columns: tag_value_pool[tag] = dic[tag].tolist().copy() # 提取Name和Tag列表 names = people["Name"].tolist() tags = people["Tag"].tolist()
步骤2:循环分配不重复的fintag
遍历每个Name和对应Tag,从可用池中随机取值并移除,确保同Tag值不重复:
with open("test.txt", "w", encoding="utf-8") as file: for name, tag in zip(names, tags): # 从当前Tag的可用池中随机选值 selected_value = random.choice(tag_value_pool[tag]) # 移除已选值,避免后续重复分配 tag_value_pool[tag].remove(selected_value) # 构建并写入prompt prompt = f"{name} {selected_value}\n" print(prompt.strip()) file.write(prompt)
关键说明
- 无需为每个Tag单独定义变量,新增Tag时代码自动适配
- 修复了原代码的两处错误:
- 原代码中
str(nam)错误地将整个Name列表转为字符串,改为当前循环的name变量 - 原代码随机数范围计算错误,改用
random.choice直接从列表选值更简洁
- 原代码中
- 同Tag下的取值绝对不会重复,完全符合需求
示例验证
用你提供的测试数据运行代码,会生成类似如下的输出(随机但同Tag值不重复):
mark red bill shark tim gloves frank cat
内容的提问来源于stack exchange,提问作者Francesco Calderone
相关产品推荐
相关产品推荐

