You need to enable JavaScript to run this app. 有没有紧凑方法用列表不重复随机元素替换字符串中的@占位符
优惠活动
大模型
产品
解决方案
定价
更多

有没有紧凑方法用列表不重复随机元素替换字符串中的@占位符

优化实现方案

原代码存在的问题

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 15:36:03