如何使用 Python 反转字符串中的单词
How do I reverse words in a string with Python
我正在尝试反转字符串中的单词,但遇到困难,我们将不胜感激:
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
(个别单词颠倒)
尝试将字符串中的每个单词拆分成一个列表(参见: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']
然后遍历列表并反转您已经处理的每个组成列表项(即单词)。
orig = "what is my name"
reverse = ""
for word in orig.split():
reverse = "{} {}".format(reverse, word[::-1])
print(reverse)
def reverseStr(s):
return ' '.join([x[::-1] for x in s.split(' ')])
def reverse_in_place(phrase):
res = []
phrase = phrase.split(" ")
for word in phrase:
word = word[::-1]
res.append(word)
res = " ".join(res)
return res
既然其他人都介绍了标点符号移动的情况,我将介绍您不希望标点符号移动的情况。
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]
匹配所有字母,+
表示 "at least one"。
第二个是要替换的字符串,或者是接受 re.MatchObject 并输出字符串的函数。我正在使用 lambda
(或无名)函数,它只输出匹配的字符串,反转。
第三个是要在替换中查找的字符串。
所以 "What is my name?" -> "tahW si ym eman?"
附录:
我最初考虑过 r'\w+'
的正则表达式,因为更好的 unicode 支持(如果给出正确的标志),但 \w
也包括数字和下划线。匹配 -
也可能是所需的行为:正则表达式将是 r'[a-zA-Z-]+'
(注意尾随连字符)和 r'[\w-]+'
但是你可能不想匹配双破折号(即 --
) 所以可能需要更多的正则表达式修改。
内置的 reversed
输出一个 reversed
对象,你必须将其转换回字符串,所以我通常更喜欢 [::-1]
选项。
[线程已关闭,但 IMO,没有得到很好的回答]
python string.lib 不包含就地 str.reverse() 方法。
所以使用内置的 reversed() 函数调用来完成同样的事情。
>>> S = "我叫什么名字"
>>> ("").join(反转(S))
'eman ym si tahw'
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],
-->esreveR gnirts
没有明显的方法可以用 Python 就地反转字符串 "truly"。但是,您可以执行以下操作:
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 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')
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))
输出:
我正在尝试反转字符串中的单词,但遇到困难,我们将不胜感激:
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
(个别单词颠倒)
尝试将字符串中的每个单词拆分成一个列表(参见: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']
然后遍历列表并反转您已经处理的每个组成列表项(即单词)。
orig = "what is my name"
reverse = ""
for word in orig.split():
reverse = "{} {}".format(reverse, word[::-1])
print(reverse)
def reverseStr(s):
return ' '.join([x[::-1] for x in s.split(' ')])
def reverse_in_place(phrase):
res = []
phrase = phrase.split(" ")
for word in phrase:
word = word[::-1]
res.append(word)
res = " ".join(res)
return res
既然其他人都介绍了标点符号移动的情况,我将介绍您不希望标点符号移动的情况。
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]
匹配所有字母,+
表示 "at least one"。
第二个是要替换的字符串,或者是接受 re.MatchObject 并输出字符串的函数。我正在使用 lambda
(或无名)函数,它只输出匹配的字符串,反转。
第三个是要在替换中查找的字符串。
所以 "What is my name?" -> "tahW si ym eman?"
附录:
我最初考虑过 r'\w+'
的正则表达式,因为更好的 unicode 支持(如果给出正确的标志),但 \w
也包括数字和下划线。匹配 -
也可能是所需的行为:正则表达式将是 r'[a-zA-Z-]+'
(注意尾随连字符)和 r'[\w-]+'
但是你可能不想匹配双破折号(即 --
) 所以可能需要更多的正则表达式修改。
内置的 reversed
输出一个 reversed
对象,你必须将其转换回字符串,所以我通常更喜欢 [::-1]
选项。
[线程已关闭,但 IMO,没有得到很好的回答]
python string.lib 不包含就地 str.reverse() 方法。
所以使用内置的 reversed() 函数调用来完成同样的事情。
>>> S = "我叫什么名字"
>>> ("").join(反转(S))
'eman ym si tahw'
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],
-->esreveR gnirts
没有明显的方法可以用 Python 就地反转字符串 "truly"。但是,您可以执行以下操作:
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 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')
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))
输出: