Complete the function that accepts a string parameter, and reverses each word in the string. All spaces in the string should be retained.

Examples

"This is an example!" ==> "sihT si na !elpmaxe"
"double  spaces"      ==> "elbuod  secaps"

Reverse words challenge from Codewars

Explanation

Solving this problem consists of four parts. splitting the string into a list of words, iterating over the words, reversing the words and joining the list into a single string.

Watch the screencast or read the explanation below:

1. Splitting the string into an list of words

The first step is to split the string using a space as the delimiter:

words = text.split(' ')

2. Iterating over the list of words

The next step is to iterate over the list of words:

for word in words:
    word

3. Reversing the word

With the iteration working, I need to reverse the words. I can do that using slicing. I can create a slice that starts with the length of the string, and ends at index 0:

for word in words:
    word[len(word)::-1]

This syntax works by starting at the end of the string and working towards the first, taking each element.

Python has a shorthand for this which means I can write it without specifying the string length:

for word in words:
    word[::-1]

Now I just need to add these reversed words to an list, to use later in the code:

reversed_words = []

for word in words:
    reversed_words.append(word[::-1])

4. Joining the list of reversed words into a single string

The last thing I need to do is join the list of reversed words into a single string and return the result. I’ll join the reversed_words using a ' ' delimiter:

return ' '.join(reversed_words)

Solution

Here is the complete solution:

def reverse_words(text):
    words = text.split(' ')

    reversed_words = []

    for word in words:
        reversed_words.append(word[::-1])

    return ' '.join(reversed_words)

For bonus points, the solution can be re-written as a single line of code:

def reverse_words(text):
    return ' '.join(word[::-1] for word in text.split(' '))