如何使用Python反转字符串中的单词
我正在尝试反转字符串中的单词,但遇到困难,请提供任何帮助:如何使用Python反转字符串中的单词,python,string,reverse,Python,String,Reverse,我正在尝试反转字符串中的单词,但遇到困难,请提供任何帮助: S = " what is my name" def reversStr(S): for x in range(len(S)): return S[::-1] break 我现在得到的是:eman ym si tahw 然而,我试图得到:tahw是ym-eman单个单词的倒数尝试将字符串中的每个单词拆分为一个列表,请参见: 例如: >>string = "This will be
S = " what is my name"
def reversStr(S):
for x in range(len(S)):
return S[::-1]
break
我现在得到的是:eman ym si tahw
然而,我试图得到:tahw是ym-eman单个单词的倒数尝试将字符串中的每个单词拆分为一个列表,请参见: 例如:
>>string = "This will be split up"
>>string_list = string.split(" ")
>>string_list
>>['This', 'will', 'be', 'split', 'up']
然后遍历列表并反转每个组成列表项,即您已经使用过的单词。由于其他人都讨论了标点符号移动的情况,因此我将讨论您不希望标点符号移动的情况
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的regex模块,是该模块中处理替换的函数。它有三个必需的参数
第一个是你匹配的正则表达式。在本例中,我使用的是r'\w+'。r表示原始字符串,[a-zA-Z]匹配所有字母,+表示至少一个
第二个是要替换的字符串,或者是接收re.MatchObject并输出字符串的函数。我使用一个lambda或无名函数,它只输出匹配的字符串,反转
第三个是要在替换中查找的字符串
那我叫什么名字?->我是伊曼吗
增编:
我最初考虑使用r'\w+'的正则表达式,因为如果给出正确的标志,\w还包括数字和下划线,则会提供更好的unicode支持。匹配-可能也是所需的行为:正则表达式将是r'[a-zA-Z-]+'注意,尾随连字符和r'[\w-]+',但您可能不希望匹配双破折号ie-因此可能需要对正则表达式进行更多修改
内置的反向输出一个反向对象,您必须将其转换回字符串,因此我通常更喜欢[:-1]选项。[线程已关闭,但IMO未得到很好的响应] python string.lib不包含就地str.reverse方法。 因此,使用内置的反向函数调用来完成同样的事情 >>>我叫什么名字 >>>.联合体 “伊曼·伊姆·斯塔沃”
def ters(a):
if a == "":
return ""
else:
z = ters(a[1:]) + a[0]
return z
反向字符串->gnirts esreveR
def ters2(k):
y = ters(k).split()
for i in range(len(y)-1,-1,-1):
print y[i],
->ESRgnits没有明显的方法可以在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))
inplace指的是在不创建副本的情况下修改对象。是的,正如我们许多人已经指出的那样,python字符串是不可变的。因此,从技术上讲,我们无法在原地反转python字符串数据类型对象。但是,如果您使用可变数据类型(例如bytearray)来存储字符串字符,您实际上可以在原地反转它
输出:
bytearray(b'esrever ot gnirts emose')
如果句子中包含多个空格,那么使用拆分函数会带来麻烦,因为在颠倒句子中的每个单词后,您不知道需要重新连接多少空格。下面的代码片段可能会有所帮助:
# 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))
输出:
你好,我是一顶帽子。可以颠倒吗?从olleH或olleH开始,你为什么要立即使用return?你试图反转字符串中单词的字母,而不是反转字符串本身?@JoshTriiJohnston是的……这不合适;你只是在颠倒每个单词的字母顺序。当涉及到数据结构时,In-place具有非常具体的含义;这意味着您正在修改实际的输入对象,而不是基于输入返回新对象。您不能就地反转Python字符串,因为Python字符串是不可变的。这是一个有趣的算法,尽管它确实为生成的字符串添加了前导空格。这也很昂贵,因为您每次都要通过循环创建一个新的字符串对象。好的答案可以解释并提供代码。考虑更新你的答案,包括解释这个代码是如何工作的,为什么它是最好的选择。我有点困惑。s.split“”是否会消耗额外的内存空间,使其不在适当的位置?@AaronZeng我不明白你在问什么。我道歉。我假设s.split“”将字符串拆分为一个新列表,这会导致额外的空间分配,因此它不在适当的位置。我在这里说的对吗?是的,它会分配一个新的单词列表,反转列表中的每个单词,然后将这些单词连接在一起。然后,由于字符串是不可变的,我假设如果不允许额外的空间,我们就不能在Python中反转字符串。是这样吗?我正在研究这个算法问题:欢迎来到,谢谢你的回答。你的答案似乎并没有回答这个问题:tahw是ym-eman。囚犯说的——还有S[::-1],是反转字符串的正常方式。
#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')
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}')
# 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))