Welcome, guest | Sign In | My Account | Store | Cart
# strings are immutable, so you need to make a copy -- and a list
# is the right intermediate datastructure, as it has a .reverse()
# method that does just what we want -- it works in-place, so...:
revchars = list(astring)        # string -> list of chars
revchars.reverse()              # inplace reverse the list
revchars = ''.join(revchars)    # list of strings -> string

# to flip words, we just work with a list-of-words instead:
revwords = astring.split()      # string -> list of words
revwords.reverse()              # inplace reverse the list
revwords = ' '.join(revwords)   # list of strings -> string

# note we use a ' ' (space) joiner for the list of words, but
# a '' (empty string) joiner for the list of characters.

# if you INSIST on oneliners, you need an auxiliary function
# (you can stick it in your builtins from sitecustomize.py...)
def reverse(alist):
    temp = alist[:]
    temp.reverse()
    return temp
# or maybe (NOT a good idea... it's messier & slower!!!):
def reverse_alternative(alist):
    return [alist[i] for i in range(-1, -len(alist)-1, -1)]
# which is "inlineable"... but *NOT* worth it...!!!

# anyway, now you CAN do brave oneliners such as:
revchars = ''.join(reverse(list(astring)))
revwords = ' '.join(reverse(astring.split()))

# the three-liners are faster and more readable, as well as
# more-idiomatic Python, but in the end Python does *NOT*
# twist your arm to make you choose the obviously-right approach:
# Python gives you the right tools, it's up to you to use them:-).

# to reverse-by-words while preserving untouched the intermediate
# whitespace, regular expression splitting can be used:
import re
revwords = re.split(r'(\s+)', astring)    # separators too since '(...)'
revwords.reverse()              # inplace reverse the list
revwords = ''.join(revwords)    # list of strings -> string
# *NOTE* the nullstring-joiner once again!

History