Моя случайная замена-система заменяет неправильные элементы

#python #string #random #replace

#python #строка #Случайный #заменить

Вопрос:

Я хочу создать программу, которая заменяет 12345 на один из каждого элемента из списка shuflo, но если список 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. Скажем, 1 заменяется на 3. Когда вы заменяете 3, вы заменяете как исходные 3, так и 1, которые уже были изменены. Вам нужно выполнить все изменения за один проход.

2. @Reti43 как бы я это сделал?

Ответ №1:

Вам нужно выполнить замену каждого числа только один раз. Это можно сделать с помощью модуля или, если числа имеют длину всего в один символ (т. Е. Только От 0 до 9), это можно сделать в виде списка, проходящего через каждый символ строки. re

Использование регулярного выражения:

 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))
 

Ответ №2:

Попробуйте следующее:

 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)"))
 

Это определенно можно было бы сильно оптимизировать, но я не уверен в вашем точном варианте использования.

Комментарии:

1. Вау! это много кода, но нужно ли мне что-то импортировать, чтобы это работало? Потому что в моем случае я получаю много ошибок.

2. В настоящее время я работаю над улучшенной версией, дайте мне 5 минут.

3. @Miklath, можете ли вы проверить, работает ли это, вам не нужно ничего импортировать, кроме random ? Если это выдает ошибки, не могли бы вы сообщить нам, что они говорят?

4. Конечно, могу я отправить вам скриншот? если да, то как?

5. stackoverflow.blog/2010/08/18/ new-image-upload-support , просто добавьте изображение в свой исходный пост и добавьте что-то вроде: «Я получаю следующую ошибку при запуске X»