Поменяйте местами каждое слово, кроме знаков препинания, без изменения их положения - Python3 - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь решить проблему с помощью приведенного ниже #PROBLEM DEFINITION -

  1. Инвертировать каждое слово во входной строке.
  2. Порядок слов не изменится.
  3. Слово состоит из букв и / или цифр.
  4. Другие символы (пробелы, знаки пунктуации) не будут изменены на обратные.

Однако я не могу удовлетворить требование соблюдения порядка. Ниже мой код. Мы будем благодарны за любую помощь.

При условии: input string = 'Hello! cu2 Ayaan ... '

Ожидается: выходная строка =' olleH! 2u c naayA ... '


def swap(a, b):
    return b, a

def reverse_each_word(sentence):
    list_of_string = [i for i in sentence]
    r = len(list_of_string) - 1
    l = 0
    while l < r:
        if not list_of_string[l].isalpha():
            l += 1
        elif not list_of_string[r].isalpha():
            r -= 1
        else:
            list_of_string[l], list_of_string[r] = swap(list_of_string[l], list_of_string[r])
            l += 1 
            r -= 1
    result = "".join(list_of_string)
    return result

Ответы [ 2 ]

1 голос
/ 11 января 2020

@ Амит - Спасибо за поддержку !! Сделал go назад и прочитал всю, REGEX, документацию (наконец). В результате я решил проблему с очень меньшим количеством строк кода. Ниже приведен код -

import re

def reverse_word(sentence):
    temp = ""
    pattern = re.compile(r'(\W+)')
    result = pattern.split(sentence)
    for i in result:
        p = re.compile("^[a-zA-Z0-9]+$") 
        if p.match(i):
            i = i[::-1]
        temp += i
    return temp
1 голос
/ 11 января 2020

Хорошие усилия. Вы почти у цели. Congrats. Я сделал минимальные изменения в вашем коде. Все, что я сделал, это разделил предложение на слова (а затем разделил каждый символ слова) и применил логику обращения c к каждому разделенному списку слов. Также была пропущена проверка ..isdi git (), поскольку согласно предварительному условию 3 слово может состоять как из алфавитов, так и из ди git. Это все. Отдых - это ваш код.

Я предположил, что слова разделены 1 и только 1 пробелом. Если нет, используйте модуль re.

Ниже приведен код. Если вы ничего не понимаете, пожалуйста, спросите.

def swap(a, b):
    return b, a

def reverse_each_word(sentence):
    list_of_string = [i for i in sentence.split(" ")]
    Finalresult = ""
    for eachString in list_of_string:
        eachString = [x for x in eachString]
        r = len(eachString) - 1
        l = 0
        while l < r:
            if not (eachString[l].isalpha() or eachString[l].isdigit()):
                l += 1
            elif not (eachString[r].isalpha() or eachString[r].isdigit()):
                r -= 1
            else:
                eachString[l], eachString[r] = swap(eachString[l], eachString[r])
                l += 1 
                r -= 1
        result = "".join(eachString)
        Finalresult += (result+" ")
    return Finalresult

print(reverse_each_word( 'Hello! cu2 Ayaan...'))

Вывод

olleH! 2uc naayA...
...