Home  >  Article  >  Backend Development  >  Briefly talk about the problem of reversing strings in Python

Briefly talk about the problem of reversing strings in Python

WBOY
WBOYOriginal
2016-12-05 13:27:131109browse

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 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn