我正在尝试反转字符串的单词,但遇到困难,任何帮助将不胜感激:
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
(个别单词颠倒)
def reverseStr(s):
return ' '.join([x[::-1] for x in s.split(' ')])
orig = "what is my name"
reverse = ""
for word in orig.split():
reverse = "{} {}".format(reverse, word[::-1])
print(reverse)
既然其他人都介绍了标点符号移动的情况,我将介绍您不希望标点符号移动的情况。
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]
选项。
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')
尝试将字符串中的每个单词拆分为一个列表(请参阅: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']
然后遍历列表并反转您已经工作的每个组成列表项(即单词)。
def reverse_in_place(phrase):
res = []
phrase = phrase.split(" ")
for word in phrase:
word = word[::-1]
res.append(word)
res = " ".join(res)
return res
[线程已关闭,但在我看来,没有得到很好的回答]
python string.lib 不包含就地 str.reverse() 方法。
因此,使用内置的reverse()函数调用来完成同样的事情。
>>> S =“我叫什么名字”
>>> ("").join(反转(S))
'eman ym si tahw'
没有明显的方法可以用 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:]
希望这是有道理的。
在Python中,字符串是不可变的。这意味着字符串一旦创建就无法更改。所以原地反转是不可能的。
Python中有很多方法可以反转字符串,但是反转后的字符串需要内存分配。
print(' '.join(word[::-1] for word in string))
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}')
如果句子包含多个空格,那么使用
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))
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