Home > Article > Backend Development > Briefly talk about the problem of reversing strings in Python
Reverse a string by word is a very common interview question. It's very simple to implement in Python.
def reverse_string_by_word(s): lst = s.split() # split by blank space by default return ' '.join(lst[::-1]) s = 'Power of Love' print reverse_string_by_word(s) # Love of Power s = 'Hello World!' print reverse_string_by_word(s) # World! Hello
The above implementation can actually meet most situations, but it is not perfect. For example, the exclamation point in the second string is not flipped, and the number of spaces in the original string is not retained. (In the above example, there is actually more than one space between Hello and World)
The result we expect should be like this.
print reverse_string_by_word(s) # Expected: !World Hello
To improve the above solution without complicating the problem, it is recommended to use the re module. You can check the official documentation of re.split(). Let's look at specific examples.
>>> import re >>> s = 'Hello World!' >>> re.split(r'\s+', s) # will discard blank spaces ['Hello', 'World!'] >>> re.split(r'(\s+)', s) # will keep spaces as a group ['Hello', ' ', 'World!'] >>> s = '< Welcome to EF.COM! >' >>> re.split(r'\s+', s) # split by spaces ['<', 'Welcome', 'to', 'EF.COM!', '>'] >>> re.split(r'(\w+)', s) # exactly split by word ['< ', 'Welcome', ' ', 'to', ' ', 'EF', '.', 'COM', '! >'] >>> re.split(r'(\s+|\w+)', s) # split by space and word ['<', ' ', '', 'Welcome', '', ' ', '', 'to', '', ' ', '', 'EF', '.', 'COM', '!', ' ', '>'] >>> ''.join(re.split(r'(\s+|\w+)', s)[::-1]) '> !COM.EF to Welcome <' >>> ''.join(re.split(r'(\s+)', s)[::-1]) '> EF.COM! to Welcome <' >>> ''.join(re.split(r'(\w+)', s)[::-1]) '! >COM.EF to Welcome< '
If you feel that using slices to reverse the sequence is not very readable, you can actually write it like this.
>>> ''.join(reversed(re.split(r'(\s+|\w+)', s))) '> !COM.EF to Welcome <'
Get it done in one sentence, so easy!
Python reverse string, includes 5 methods in total, the first one is the simplest, that is, the step size is -1, and the string is output;
The method is as follows
Comparison of 5 methods:
1. The simple step size is -1, which is the flip of the string (commonly used);
2. Swap the positions of the front and back letters;
3. Recursive method, output one character at a time;
4. Double-ended queue, use extendleft() function;
5. Use a for loop to output from left to right;
Code:
# -*- coding: utf-8 -*- #eclipse pydev, python 3.3 #by C.L.Wang #time: 2014. 4. 11 string = 'abcdef' def string_reverse1(string): return string[::-1] def string_reverse2(string): t = list(string) l = len(t) for i,j in zip(range(l-1, 0, -1), range(l//2)): t[i], t[j] = t[j], t[i] return "".join(t) def string_reverse3(string): if len(string) <= 1: return string return string_reverse3(string[1:]) + string[0] from collections import deque def string_reverse4(string): d = deque() d.extendleft(string) return ''.join(d) def string_reverse5(string): #return ''.join(string[len(string) - i] for i in range(1, len(string)+1)) return ''.join(string[i] for i in range(len(string)-1, -1, -1)) print(string_reverse1(string)) print(string_reverse2(string)) print(string_reverse3(string)) print(string_reverse4(string)) print(string_reverse5(string))
Output:
fedcba fedcba fedcba fedcba fedcba