如何使用Python反转字符串中的单词[重复]

问题描述 投票:0回答:12

我正在尝试反转字符串的单词,但遇到困难,任何帮助将不胜感激:

S = " what is my name"

def reversStr(S):
    for x in range(len(S)):
        return S[::-1]
        break

我现在得到的是:

eman ym si tahw

但是,我试图得到:

tahw is ym eman
(个别单词颠倒)

python string reverse
12个回答
8
投票
def reverseStr(s):
  return ' '.join([x[::-1] for x in s.split(' ')])

1
投票
orig = "what is my name"
reverse = ""
for word in orig.split():
    reverse = "{} {}".format(reverse, word[::-1])
print(reverse)

1
投票

既然其他人都介绍了标点符号移动的情况,我将介绍您不希望标点符号移动的情况。

import re
def reverse_words(sentence):
    return re.sub(r'[a-zA-Z]+', lambda x : x.group()[::-1], sentence)

打破这个。

re
是Python的正则表达式模块,
re.sub
是该模块中处理替换的函数。它具有三个必需参数。

第一个是您匹配的正则表达式。在本例中,我使用

r'\w+'
。 r 表示原始字符串,
[a-zA-Z]
匹配所有字母,
+
表示“至少一个”。

第二个是要替换的字符串,或者是接受 re.MatchObject 并输出字符串的函数。我使用的是

lambda
(或无名)函数,它只是输出匹配的字符串(反转)。

第三个是您要在替换中查找的字符串。

那么“我叫什么名字?” ->“tahW si ym eman?”

附录:

我最初考虑了

r'\w+'
的正则表达式,因为更好的 unicode 支持(如果给出了正确的标志),但
\w
还包含数字和下划线。匹配
-
也可能是所需的行为:正则表达式将是
r'[a-zA-Z-]+'
(注意尾随连字符)和
r'[\w-]+'
但您可能不希望匹配双破折号(即
--
),因此更多的正则表达式修改可能被需要。

内置

reversed
输出一个
reversed
对象,您必须将其转换回字符串,所以我通常更喜欢
[::-1]
选项。


1
投票

inplace
指的是修改对象而不创建副本。是的,就像我们许多人已经指出的那样,Python 字符串是不可变的。因此从技术上讲,我们无法反转 python
string
数据类型对象
inplace
。但是,如果您使用可变数据类型,例如
bytearray
来存储字符串字符,您实际上可以反转它
inplace

#slicing creates copy; implies not-inplace reversing
def rev(x):
    return x[-1::-1]

# inplace reversing, if input is bytearray datatype
def rev_inplace(x: bytearray):
    i = 0; j = len(x)-1
    while i<j:
        t = x[i]
        x[i] = x[j]
        x[j] = t
        i += 1; j -= 1
    return x

输入:

x = bytearray(b'some string to reverse')      
rev_inplace(x)

输出:

bytearray(b'esrever ot gnirts emose')

0
投票

尝试将字符串中的每个单词拆分为一个列表(请参阅:https://docs.python.org/2/library/stdtypes.html#str.split)。

示例:

>>string = "This will be split up"
>>string_list = string.split(" ")
>>string_list
>>['This', 'will', 'be', 'split', 'up']

然后遍历列表并反转您已经工作的每个组成列表项(即单词)。


0
投票
def reverse_in_place(phrase):
    res = []
    phrase = phrase.split(" ")
    for word in phrase:
        word = word[::-1]
        res.append(word)
    res = " ".join(res)
    return res

0
投票

[线程已关闭,但在我看来,没有得到很好的回答]

python string.lib 不包含就地 str.reverse() 方法。
因此,使用内置的reverse()函数调用来完成同样的事情。

>>> S =“我叫什么名字”
>>> ("").join(反转(S))
'eman ym si tahw'


0
投票

没有明显的方法可以用 Python “真正”就地反转字符串。但是,您可以执行以下操作:

def reverse_string_inplace(string):
    w = len(string)-1
    p = w
    while True:
        q = string[p]
        string = ' ' + string + q
        w -= 1
        if w < 0:
            break
    return string[(p+1)*2:]

希望这是有道理的。


0
投票

在Python中,字符串是不可变的。这意味着字符串一旦创建就无法更改。所以原地反转是不可能的。

Python中有很多方法可以反转字符串,但是反转后的字符串需要内存分配。

print(' '.join(word[::-1] for word in string))

0
投票
s1 = input("Enter a string with multiple words:")

print(f'Original:{s1}')
print(f'Reverse is:{s1[::-1]}')

each_word_new_list = []

s1_split = s1.split()

for i in range(0,len(s1_split)):
    each_word_new_list.append(s1_split[i][::-1])

print(f'New Reverse as List:{each_word_new_list}')

each_word_new_string=' '.join(each_word_new_list)

print(f'New Reverse as String:{each_word_new_string}')

0
投票

如果句子包含多个空格,那么使用

split()
函数会带来麻烦,因为你不知道在颠倒句子中的每个单词后需要重新连接多少个空格。下面的片段可能会有所帮助:

# Sentence having multiple spaces
given_str = "I  know this   country runs by mafia "
tmp = ""
tmp_list = []
for i in given_str:
    if i != ' ':
        tmp = tmp + i
    else:      
        if tmp == "":
            tmp_list.append(i)
        else:
            tmp_list.append(tmp)
            tmp_list.append(i)
            tmp = ""

print(tmp_list)
rev_list = []
for x in tmp_list:
    rev = x[::-1]
    rev_list.append(rev)
print(rev_list)
print(''.join(rev_list))

输出:


0
投票
def rev(a):
    if a == "":
        return ""
    else:
        z = rev(a[1:]) + a[0]
        return z

反转字符串 --> gnirts esreveR

def rev(k):
    y = rev(k).split()
    for i in range(len(y)-1,-1,-1):
        print y[i],

-->esreveR gnirts

© www.soinside.com 2019 - 2024. All rights reserved.