#python #python-3.x #string
#python #python-3.x #строка
Вопрос:
Я ученик, и я выполнял упражнение по кодированию символов в codewars, мой код терпит неудачу в тестах на «(» и «)» и случайные символы
def duplicate_encode(word):
#your code here
word = word.lower()
for ch in word:
if word.count(ch) == 1:
word = word.replace(ch, "(")
else:
word = word.replace(ch, ")")
return word
кто-нибудь может помочь
Формулировка проблемы выглядит следующим образом :
Цель этого упражнения — преобразовать строку в новую строку, где каждый символ в новой строке равен «(«, если этот символ появляется только один раз в исходной строке, или «)», если этот символ появляется более одного раза в исходной строке. Игнорируйте заглавные буквы при определении, является ли символ дубликатом.
Комментарии:
1. В какой строке ввода это сбой?
2. Для скобок или строки случайных символов
3. Например, HaO@lknFmcxzI( RHJ
Ответ №1:
Например, ввод: HaO@lknFmcxzI( RHJ
Когда ваша итерация дойдет до (
, она подсчитает количество (
в строке, включая некоторые, которых не было в исходной строке, потому что ваша функция помещает new (
в строку.
Кроме того, если ваша функция использует replace(ch, ...)
и ch
равно (
или )
, вы изменяете все скобки, которые вы добавили до сих пор.
Способ избежать этого — не продолжать изменять строку, пока вы ее просматриваете, а создать новую отдельную последовательность символов.
def duplicate_encode(word):
word = word.lower()
new = []
for ch in word:
if word.count(ch) == 1:
new.append('(')
else:
new.append(')')
return ''.join(new)
Один лайнер в ваших комментариях:
''.join('(' if word.lower().count(ch) == 1 else ')' for ch in word.lower())
использует выражение генератора. Он перебирает строку (преобразованную в нижний регистр) и генерирует либо (
или )
для каждого из них (в зависимости от количества), а затем в конце объединяет все символы в новую строку.
Комментарии:
1. Вы были довольно близки.
2. Я провел тест на code wars, но он провалился для 19 тестов, один из которых был:
3. lPFwRan)wbuHJxb!vJTPdl e
4. Я не очень привык к однострочникам, но это было какое-то решение, которое я нашел на git hub, может быть, вы могли бы мне это объяснить
return ''.join('(' if word.lower().count(ch) == 1 else ')' for ch in word.lower())
5. Я пересмотрел свой ответ и добавил описание вашего однострочника.