Кодирование повторяющихся слов не работает в коде?

#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. Я пересмотрел свой ответ и добавил описание вашего однострочника.