【问题标题】:My random replace-system replaces the wrong items我的随机替换系统替换了错误的项目
【发布时间】:2021-05-28 23:26:57
【问题描述】:

我想构建一个程序,用 shuflo 列表中的每个项目之一替换 12345,但如果 shuflo 列表包含从 1 到 5 的数字,它也会替换它们。

这是我的代码:

shuflo = [1, 2, 3, 4, 5]

def build(x):
    random.shuffle(shuflo)
    lock = shuflo
    lack = str(x)
    lack = lack.replace("1", str(lock[0]))
    lack = lack.replace("2", str(lock[1]))
    lack = lack.replace("3", str(lock[2]))
    lack = lack.replace("4", str(lock[3]))
    lack = lack.replace("5", str(lock[4]))
    Ponf = [lack, eval(lack)]
    return Ponf

print(build("(1)+(2)+(3)+(4)+(5)"))

典型的结果是:

['(3)+(1)+(2)+(3)+(5)', 14]

在列表 shuflo 中只有 3 个中的一个,但有些元素被替换了两次,所以它不起作用。

我该如何解决这个问题???

【问题讨论】:

  • 说 1 被 3 替换。当你替换 3 时,你将替换原来的 3 和已经更改的 1。您需要一次完成所有更改。
  • @Reti43 我该怎么做?

标签: python string random replace


【解决方案1】:

尝试以下方法:

import random

shuflo = [1, 2, 3, 4, 5]

def build(x):
    random.shuffle(shuflo)
    lack = str(x)
    table = str.maketrans({str(i): str(shuflo[i-1]) for i in range(1,len(shuflo)+1})
    lack = lack.translate(table)
    Ponf = [lack, eval(lack)]
    return Ponf

print(build("(1)+(2)+(3)+(4)+(5)"))

这肯定可以优化很多,但我不确定你的确切用例。

【讨论】:

  • 哇!那是很多代码,但我需要导入一些东西才能工作吗?因为就我而言,我遇到了很多错误。
  • 我目前正在改进版本,请给我 5 分钟。
  • @Miklath,你能检查一下它是否有效吗?除了random,你应该不需要导入任何东西?如果它给你错误,你能告诉我们他们说什么吗?
  • 好的,我可以给你截图吗?如果有怎么办?
  • stackoverflow.blog/2010/08/18/new-image-upload-support,只需将图片添加到您的原始帖子中并添加如下内容:“运行 X 时出现以下错误”
【解决方案2】:

您只需要对每个号码执行一次替换。这可以通过re 模块完成,或者,如果数字只有一个字符长(即仅从 0 到 9),则可以在遍历字符串的每个字符的列表推导中完成。

使用正则表达式:

import random
import re

def build(x,shuflo=[1, 2, 3, 4, 5]):
    shuffled = random.sample(shuflo,len(shuflo))
    d = {str(i):str(v) for i,v in zip(shuflo,shuffled)}
    pattern = "|".join(sorted(d,key=len,reverse=True))
    return re.sub(pattern,lambda c:d[c.group()],x)

build("(1)+(2)+(3)+(4)+(5)")
'(5)+(3)+(2)+(4)+(1)'

使用列表推导(单个字符替换):

import random

def build(x,shuflo=[1, 2, 3, 4, 5]):
    shuffled = random.sample(shuflo,len(shuflo))
    d = {str(i):str(v) for i,v in zip(shuflo,shuffled)}
    return "".join(d.get(c,c) for c in x)

build("(1)+(2)+(3)+(4)+(5)")
'(1)+(4)+(5)+(2)+(3)'

maketrans 也适用于单字符替换:

def build(x,shuflo=[1, 2, 3, 4, 5]):
    shuffled = random.sample(shuflo,len(shuflo))
    d = {str(i):str(v) for i,v in zip(shuflo,shuffled)}
    return x.translate(str.maketrans(d))

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2019-01-09
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多