2014-09-09 3 views
0

Я хочу упростить замену определенных символов строки in-situ - со списком. Попытки до сих пор просто возвращают список строк - каждый элемент списка с каждым символом, замененным из строки проверки.Замена символов с использованием учета списков

Рекомендации/решения?

Входы:

reveal = "password" 
ltrTried = "sr" 

Обязательный выход:

return = "**ss**r*" 

Попадая:

('**ss****', '******r*') 
+1

Вы можете добавить ввод и ожидаемый выход? –

+2

Перечисления списков не предназначены для ситуаций с побочными эффектами, но то, что вы ищете здесь, является полностью побочным эффектом (поскольку вы не создаете список, который хотите сохранить). Что не так с вашим циклом for и почему вы хотите заменить его пониманием? –

+0

См. [Здесь] (http://stackoverflow.com/questions/5753597/is-it-pythonic-to-use-list-comprehensions-for-just-side-effects), [здесь] (http: // stackoverflow .com/questions/8068251/why-is-python-list-assrehension-иногда-нахмуренный) и [здесь] (http://stackoverflow.com/questions/8695488/proper-use-of-list-comprehensions- python) для получения дополнительных побочных эффектов. –

ответ

2

Если вы хотите сделать это, используя список понимание, вы хотите, чтобы заменить его по буквам, как это:

reveal = "".join((letter if letter in ltrFound else "*") for letter in reveal) 

Обратите внимание, что

  • Мы повторяем вашу строку reveal, а не ваш список ltrFound (или строку).
  • Каждый элемент заменяется тронарным оператором letter if letter in ltrFound else "*". Это гарантирует, что если письмо в reveal не находится в ltrFound, оно заменяется на *.
  • Мы закончим, соединяя все буквы.
+0

Вот что мне не хватало .... ELSE. Спасибо, что поставил меня из моих страданий. Вероятно, очевидно, что я использовал Python всего несколько недель. Хотелось исследовать списки понимания, но не мог понять, как заставить его работать таким образом. Заменить буквы, которые у меня были, было легко - заменив те, которые я не делал, меня заводило! –

+0

это генератор, не понимающий список –

+0

@alcyone_pleiades: 'if' здесь отличается от' if' в вашем исходном коде. Вы использовали предложение 'if' в понимании, которое фильтрует значения, только итерации тех, для которых' if' истинно. Этот ответ использует выражение 'if-else', которое всегда оценивает значение, но одно из двух разных значений в зависимости от того, является ли тест истинным. Они могут выглядеть похожими, но не смешивать их. – abarnert

1

попробовать этот

re.sub("[^%s]"%guesses,"*",solution_string) 

при условии предположения является строка

+0

RegEx Я могу сделать ... но я все равно ценю предложение. –

2

Просто для удовольствия, это другой способ сделать это неизменно, используя карту перевода.

Если вы хотите, чтобы заменить все, что было в ltrFound, что было бы легко:

tr = str.maketrans(ltrFound, '*' * len(ltrFound)) 
print(reveal.translate(tr)) 

Но вы хотите сделать наоборот, заменить все, что это не в ltrFound. И вы не хотите строить таблицу переводов всех 100K + символов, которые не являются s. Так что ты можешь сделать?

Вы можете построить таблицу 6 символов, которые не s но находятся в reveal:

notFound = ''.join(set(reveal) - set(ltrFound)) # 'adoprw' 
tr = str.maketrans(notFound, '*' * len(notFound)) 
print(reveal.translate(tr)) 

выше использует Python 3.x; для 2.x, maketrans является функцией в модуле string, а не классом класса str (и есть еще несколько отличий, но они здесь не имеют значения). Итак:

import string 
notFound = ''.join(set(reveal) - set(ltrFound)) # 'adoprw' 
tr = string.maketrans(notFound, '*' * len(notFound)) 
print(reveal.translate(tr)) 
+1

hah Я набрал большую часть этого же ответа, а затем положил решение re вместо этого! +1 –

+0

@ JoranBeasley: Я не собирался писать это, пока не понял, что это очевидный способ оптимизировать свое решение, основанное на замене, выполнив все «замену» сразу, а не поиск отдельных символов по повторяя строку ... а потом, как только я закончил, я понял, что понятия не имею, как это объяснить, и почти удалил ее, но люди уже ее поддерживали к тому времени, поэтому я подумал, что я мог бы также оставить ее. – abarnert

Смежные вопросы