Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python反转字符串中的单词_Python_String_Reverse - Fatal编程技术网

如何使用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))