有没有紧凑方法用列表不重复随机元素替换字符串中的@占位符
优化实现方案
原代码存在的问题
random.shuffle是原地操作,返回值为None,原代码中temp_names = random.shuffle(names)会触发AttributeError,调用temp_names.pop会直接失败- 逐字符遍历字符串拼接效率低,代码冗余
- 没有做占位符数量校验,当字符串中@的数量超过姓名列表长度时会报错
推荐优化方案
方案1:使用re.sub + random.sample(最简洁)
核心逻辑:先统计选中字符串的@数量,用random.sample取出对应数量的无重复姓名,通过re.sub的回调函数依次替换每个@。
import random import re names = ['Peter', 'James', 'Claire', 'Julia'] str_list = [ "@ has bought 8 apples today", "@ and @ are together for 10 years", "If @ wouldn't have told me that, I would have never known that you got in touch with @." ] while True: raw_str = random.choice(str_list) placeholder_count = raw_str.count('@') # 跳过占位符数量超过姓名总数的字符串,避免报错 if placeholder_count > len(names): continue # 生成无重复的随机姓名迭代器 name_iter = iter(random.sample(names, k=placeholder_count)) # 逐个替换@ result = re.sub(r'@', lambda _: next(name_iter), raw_str) print(result) input('按任意键继续')
方案2:纯字符串方法(无需引入re库)
如果不想用正则表达式,可以用split拆分字符串后拼接实现:
import random names = ['Peter', 'James', 'Claire', 'Julia'] str_list = [ "@ has bought 8 apples today", "@ and @ are together for 10 years", "If @ wouldn't have told me that, I would have never known that you got in touch with @." ] while True: raw_str = random.choice(str_list) placeholder_count = raw_str.count('@') if placeholder_count > len(names): continue selected_names = random.sample(names, k=placeholder_count) parts = raw_str.split('@') # 拼接拆分后的字符串和姓名 result = ''.join(p for pair in zip(parts, selected_names + ['']) for p in pair) print(result) input('按任意键继续')
优化点说明
- 用
random.sample直接获取指定数量的无重复随机姓名,避免手动shuffle的冗余操作和bug - 无需逐字符遍历,使用内置字符串/正则方法实现替换,性能和可读性都更高
- 新增占位符数量校验,避免运行时异常
内容的提问来源于stack exchange,提问作者c0mr4t
相关产品推荐
相关产品推荐

