2016-05-11 4 views
0
s="I love you" 

как я могу получить "I evol uoy"?python3, как отменить каждую букву слова в предложении

Я пытался ...

words=s.split() 

for x in words: 
    c=list(x) 
    c.reverse() 
    " ".join(c) 

и я получаю ...

'I' 
'evol' 
'uoy' 

Я попытался снова ...

words=s.split() 
s1=[] 

for x in words: 
    c=list(x) 
    c.reverse() 
    for y in c: 
     s1.append(y) 

Сейчас s1 является:

['I', 'e', 'v', 'o', 'l', 'u', 'o', 'y'] 

, но между словами нет пробела.

ответ

4

Используйте split, чтобы получить слова, затем переверните и reverse каждое слово, а затем join их.

>>> s = "I love you" 
>>> " ".join(word[::-1] for word in s.split()) 
'I evol uoy' 
+1

'_' является плохим выбором для имени переменной – vaultah

+0

Я думаю, что это не так, если вы должны игнорировать его. – AKS

+1

да ... но вы не игнорируете его. – vaultah

2

Вот как исправить свое первое решение:

s = "I love you" 

words = s.split() 

def reverse_word(x): 
    c = list(x) 
    c.reverse() 
    return "".join(c) 

result = " ".join(reverse_word(w) for w in words) 

print(result) 

важные вещи, чтобы исправить это, что:

  1. Просто позвонив " ".join(c) без использования его где-то не помогает. c - это копия x, а при обратном ее не изменяется x.
  2. " ".join(c) все равно неправильно, потому что вы не хотите пробела между буквами, так что теперь это "".join(c). Пространства добавляются к фактическому обратному предложению.

И второй один:

s1 = [] 

for x in words: 
    new_word = [] 
    c = list(x) 
    c.reverse() 
    for y in c: 
     new_word.append(y) 
    s1.append("".join(new_word)) 

result = " ".join(s1) 

Важным отличием является то, что вам нужен список для каждого слова (состоящего из букв), а также для всего предложения (состоящий из слов), так как поскольку вы видели, что один список для обоих не работает. Я сохранил его похожим на ваш код, но new_word на самом деле лишний, поскольку это всего лишь точная копия c. Таким образом, можно упростить следующим образом:

s1 = [] 

for x in words: 
    c = list(x) 
    c.reverse() 
    s1.append("".join(c)) 

result = " ".join(s1) 

Это очень общий шаблон: создать пустой список, добавить какой-то элемент к нему в каждой итерации для цикла, а затем сохранить конечный результат. Это настолько часто, что Python имеет специальный синтаксис для этого называется списковых:

def reverse_word(x): 
    c = list(x) 
    c.reverse() 
    return "".join(c) 

s1 = [reverse_word(word) for word in words] 

Это более элегантный, Pythonic путь. На самом деле вы заметите, что первый бит кода выше почти точно это, за исключением того, что я сразу использовал s1, даже не назвав его, и нет квадратных скобок, потому что теперь это понимание генератора и хорошая небольшая функция синтаксиса Python означает, что только круглые скобки действительны, так как join принимает только один аргумент. Но теперь мы углубляемся, не слишком переживайте.

Окончательно reverse_word(word) может быть просто заменен на word[s::-1] с использованием нотации среза Python, и все может быть сделано за один шаг, и это решение, данное AKS.

0

Разделите строку на слова, отмените каждое слово, затем присоедините их.

' '.join(i[::-1] for i in s.split()) 
Смежные вопросы