#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»