42

我遇到了一个奇怪的 Codecademy 练习,该练习需要一个函数,该函数将字符串作为输入并以相反的顺序返回它。唯一的问题是您不能在 stackoverflow 上使用反向方法或常见答案,[::-1].

显然,在现实的编程世界中,很可能会使用扩展切片方法,甚至使用该reversed函数,但也许在某些情况下这不起作用?

我在下面以问答方式提出了一个解决方案,以防将来对人们有所帮助。

4

43 回答 43

67

你也可以用递归来做到这一点:

def reverse(text):
    if len(text) <= 1:
        return text

    return reverse(text[1:]) + text[0]

还有一个简单的字符串示例hello

   reverse(hello)
 = reverse(ello) + h           # The recursive step
 = reverse(llo) + e + h
 = reverse(lo) + l + e + h
 = reverse(o) + l + l + e + h  # Base case
 = o + l + l + e + h
 = olleh
于 2013-09-08T17:59:05.360 回答
19

只是另一种选择:

from collections import deque
def reverse(iterable):
    d = deque()
    d.extendleft(iterable)
    return ''.join(d)
于 2013-09-08T18:08:54.773 回答
12

使用反向range

def reverse(strs):
    for i in xrange(len(strs)-1, -1, -1):
        yield strs[i]
...         
>>> ''.join(reverse('hello'))
'olleh'

xrangerange使用 -1 步骤会以相反的顺序返回项目,因此我们需要从len(string)-1-1(不包括)迭代并从字符串中一个接一个地获取项目。

>>> list(xrange(len(strs) -1, -1 , -1))
[4, 3, 2, 1, 0]  #iterate over these indexes and fetch the items from the string

单线:

def reverse(strs):
    return ''.join([strs[i] for i in xrange(len(strs)-1, -1, -1)])
... 
>>> reverse('hello')
'olleh'
于 2013-09-08T17:59:27.983 回答
11

编辑

最近关于这个问题的活动让我回顾并改变我的解决方案,使用生成器快速单线:

rev = ''.join([text[len(text) - count] for count in xrange(1,len(text)+1)])

尽管显然这里有一些更好的答案,例如 range 或 xrange 函数中的负步。以下是我原来的解决方案:


这是我的解决方案,我将逐步解释

def reverse(text):

    lst = []
    count = 1

    for i in range(0,len(text)):

        lst.append(text[len(text)-count])
        count += 1

    lst = ''.join(lst)
    return lst

print reverse('hello')

首先,我们必须将参数传递给函数,在这种情况下是text.

接下来,我设置了一个空列表,命名lst为以后使用。(实际上,在我进入循环之前,我并不知道我需要这个列表for,你马上就会明白为什么它是必要的。)

一旦我进入循环,这个count变量就会有意义for

因此,让我们看一下我们正在尝试完成的基本版本:

将最后一个字符附加到列表中会开始相反的顺序是有道理的。例如:

>>lst = []
>>word = 'foo'
>>lst.append(word[2])
>>print lst
['o']

但是为了继续颠倒顺序,我们需要追加word[1]然后word[0]

>>lst.append(word[2])
>>lst.append(word[1])
>>lst.append(word[0])
>>print lst
['o','o','f']

太好了,我们现在有一个列表,其中包含以相反顺序排列的原始单词,并且可以通过使用将其转换回字符串.join()。但是有一个问题。这适用于单词 foo,它甚至适用于长度为 3 个字符的任何单词。但是一个有 5 个字符的单词呢?还是10个字?现在它行不通了。如果有一种方法可以动态更改我们附加的索引,以便以相反的顺序返回任何单词呢?

输入 for 循环。

for i in range(0,len(text)):

    lst.append(text[len(text)-count])
    count += 1

首先,必须使用in range()而不仅仅是in,因为我们需要遍历单词中的字符,但我们还需要拉取单词的索引值,以便我们改变顺序。

我们的 for 循环主体的第一部分应该看起来很熟悉。它非常类似于

>>lst.append(word[..index..])

其实它的基本概念是完全一样的:

>>lst.append(text[..index..])

那么中间的所有东西在做什么呢?

好吧,我们需要首先将最后一个字母的索引附加到我们的列表中,即单词的长度text,-1。从现在开始,我们将其称为 l(t) -1

>>lst.append(text[len(text)-1])

仅此一项就总能得到我们单词的最后一个字母,并将其附加到lst,无论单词的长度如何。但是现在我们有了最后一个字母,即 l(t) - 1,我们需要倒数第二个字母,即 l(t) - 2,依此类推,直到没有更多的字符可以附加到列表中. 还记得我们count上面的变量吗?那会派上用场的。通过使用for循环,我们可以在count每次迭代中增加 1 的值,这样我们减去的值就会增加,直到 for 循环遍历整个单词:

>>for i in range(0,len(text)):
..        
..      lst.append(text[len(text)-count])
..      count += 1

现在我们有了函数的核心,让我们看看到目前为止我们有什么:

def reverse(text):

    lst = []
    count = 1

    for i in range(0,len(text)):

        lst.append(text[len(text)-count])
        count += 1

我们快完成了!现在,如果我们用“hello”这个词来调用我们的函数,我们会得到一个如下所示的列表:

['o','l','l','e','h']

我们不想要一个列表,我们想要一个字符串。我们可以使用.join

def reverse(text):

    lst = []
    count = 1

    for i in range(0,len(text)):

        lst.append(text[len(text)-count])
        count += 1

    lst = ''.join(lst) # join the letters together without a space
    return lst

就是这样。如果我们在 reverse() 上调用单词“hello”,我们会得到:

>>print reverse('hello')
olleh

显然,这比现实生活中所需的代码要多得多。使用反转函数或扩展切片将是完成此任务的最佳方式,但也许在某些情况下它不起作用,而您将需要它。不管怎样,我想我会把它分享给任何有兴趣的人。

如果你们有任何其他想法,我很想听听他们的意见!

于 2013-09-08T17:56:45.013 回答
7

只用了几天的 Python 编码,但我觉得这是一个相当干净的解决方案。创建一个空列表,遍历字符串中的每个字母并将其附加到列表的前面,将连接的列表作为字符串返回。

def reverse(text):
backwardstext = []
for letter in text:
    backwardstext.insert(0, letter)
return ''.join(backwardstext)
于 2014-07-09T20:38:30.603 回答
6

我用这个:

def reverse(text):
s=""
l=len(text)
for i in range(l):
    s+=text[l-1-i]
return s
于 2014-07-20T04:19:29.897 回答
4

这是一个非常有趣的问题,我想提供一个简单的单行答案:

>>> S='abcdefg'
>>> ''.join(item[1] for item in sorted(enumerate(S), reverse=True))
'gfedcba'

简要说明:

enumerate()返回[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')]。索引和值。要反转值,只需将其反向排序sorted()。最后,只是把它放在一起回到一个str

于 2013-09-22T02:30:47.440 回答
4

受乔恩回答的启发,这个怎么样

word = 'hello'
q = deque(word)
''.join(q.pop() for _ in range(len(word)))
于 2013-09-08T18:45:20.183 回答
3

我在我的仓库中创建了如何在 python 中反转字符串的不同版本: https ://github.com/fedmich/Python-Codes/tree/master/Reverse%20a%20String

您可以通过使用列表理解或lambda 技术来做到这一点:

# Reverse a string without using reverse() function
s = 'Federico';
li = list( s )  #convert string to list

ret = [ li[i-1] for i in xrange(len(li),0,-1)  ]    #1 liner lambda
print ( "".join( ret ) )

或通过向后 for 循环

# Reverse a string without using reverse() function
s = 'Federico';
r = []

length = len(s)
for i in xrange(length,0,-1):
    r.append( s[ i - 1] )

print ( "".join(r) )
于 2014-06-02T11:49:05.433 回答
3
reduce(lambda x, y : y + x, "hello world")
于 2015-06-01T06:26:42.047 回答
2
def reverse(s):
    return "".join(s[i] for i in range(len(s)-1, -1, -1))
于 2015-03-04T22:00:31.400 回答
2

打高尔夫球的版本:r=lambda x:"".join(x[i] for i in range(len(x-1),-1,-1))

于 2013-09-08T18:00:44.963 回答
2

我刚刚在代码学院解决了这个问题,并且正在检查我的答案并浏览了这个列表。所以我对python的理解非常有限,我只是这样做了,它开始工作了。

def reverse(s):
    i = len(s) - 1
    sNew = ''
    while  i >= 0:
        sNew = sNew + str(s[i])
        i = i -1
    return sNew
于 2014-03-06T23:24:00.877 回答
2

Blender 的回答很可爱,但是对于很长的字符串,它会导致RuntimeError: maximum recursion depth exceeded. 可以将相同的代码重构为一个 while 循环,就像 Python 中的递归经常必须做的那样。由于时间和内存的问题,显然仍然很糟糕,但至少不会出错。

def reverse(text):
    answer = ""
    while text:
        answer = text[0] + answer
        text = text[1:]
    return answer
于 2015-06-17T22:49:53.340 回答
1

我还刚刚解决了 codeacademy 上的对应练习,并想将我的方法与其他人进行比较。到目前为止我还没有找到我使用的解决方案,所以我想我在这里注册并将我的解决方案提供给其他人。也许我会收到关于如何改进代码的建议或有用的评论。

好的,我没有使用任何列表来存储字符串,而是访问了字符串索引。起初我花了一点时间来处理 len() 和索引号,但最终它起作用了:)。

def reverse(x):
reversestring = ""
for n in range(len(str(x))-1,-1, -1):
    reversestring += x[n]
return reversestring 

我仍然想知道是否reversestring = ""可以以更优雅的方式解决它,或者它是否是“糟糕的风格”,但到目前为止我找不到答案。

于 2014-03-26T13:36:36.087 回答
1
def reverse(text):
    a=""
    l=len(text)
    while(l>=1):
        a+=text[l-1]
        l-=1
    return a

我只是将字符串 a 与文本的最高索引连接起来(每个循环继续递减 1)。

于 2014-05-11T14:34:21.197 回答
1

我为实现反向字符串所做的只是xrange在 for 循环中使用具有字符串长度的函数,然后按照以下步骤后退:

myString = "ABC"

for index in xrange(len(myString),-1):
    print index

我的输出是“CBA”

于 2014-06-21T14:56:36.017 回答
1

您可以简单地从最后一个字符开始反向迭代您的字符串。使用python,您可以使用列表推导以相反的顺序构造字符列表,然后将它们连接起来以在单行中获取反转的字符串:

def reverse(s):
  return "".join([s[-i-1] for i in xrange(len(s))])

如果您甚至不允许使用负索引,则应替换s[-i-1]s[len(s)-i-1]

于 2014-07-07T21:18:07.757 回答
1
def reverseThatString(theString):
    reversedString = ""
    lenOfString = len(theString)
    for i,j in enumerate(theString):
        lenOfString -= 1
        reversedString += theString[lenOfString]
    return reversedString
于 2014-11-27T10:28:57.323 回答
1

您已经收到了很多替代答案,但只是为了添加另一个简单的解决方案——首先想到的是这样的:

def reverse(text):
    reversed_text = ""   

    for n in range(len(text)):
        reversed_text += text[-1 - n]

    return reversed_text

它没有人们提到的其他一些选项(或内置方法)那么快,但很容易理解,因为我们只是使用text字符串的长度通过从末端向前面切片来一次连接一个字符.

于 2014-09-14T20:10:59.883 回答
1

你可以这样做

def rev(str):
   rev = ""
   for i in range(0,len(str)):
   rev = rev + str[(len(str)-1)-i]
   return rev
于 2015-01-06T12:53:15.407 回答
1

这是我的贡献:

def rev(test):  
    test = list(test)
    i = len(test)-1
    result = []

    print test
    while i >= 0:
        result.append(test.pop(i))
        i -= 1
    return "".join(result)
于 2015-01-17T00:22:49.297 回答
1

这是一种使用 while 循环的方法:

def reverse(s):
    t = -1
    s2 = ''
    while abs(t) < len(s) + 1: 
        s2 = s2 + s[t]
        t  = t - 1
    return s2
于 2014-03-18T01:01:01.990 回答
1

今天有人问我在纸笔上做同样的练习,所以我想出了这个列表功能:

def rev(s):
  l = len(s)
  for i,j in zip(range(l-1, 0, -1), range(l//2)):
    s[i], s[j] = s[j], s[i]
  return s

可以与字符串一起使用"".join(rev(list("hello")))

于 2013-11-23T01:21:04.323 回答
1

这是我使用 for i in range 循环的解决方案:

def reverse(string):
    tmp = ""
    for i in range(1,len(string)+1):
        tmp += string[len(string)-i]            
    return tmp

这很容易理解。我从 1 开始以避免索引超出范围。

于 2015-01-05T13:17:16.303 回答
1

试试这个简单而优雅的代码。

my_string= "sentence"
new_str = ""
for i in my_string:
    new_str = i + new_str
print(new_str)
于 2021-10-31T15:03:13.307 回答
1

这是一个使用列表作为堆栈的方法:

def reverse(s):
  rev = [_t for _t in s]
  t = ''
  while len(rev) != 0:
    t+=rev.pop()
  return t
于 2017-05-02T00:03:15.853 回答
0

我的解决方案:

s = raw_input("输入字符串")
print
def reverse(text):

st = ""  
rev = ""  
count = len(text)  
print "Lenght of text: ", len(text)  
print  
for c in range(len(text)):  
    count = count - 1  
    st = st + "".join(text[c])  
    rev = rev + "".join(text[count])  
    print "count:       ", count  
    print "print c:     ", c  
    print "text[c]:     ", text[c]  
    print  
print "Original:    ", st  
print "Reversed:    ", rev  
return rev  

反向

结果画面

输入字符串 joca

文字长度:4

计数:3
打印 c:0
文本 [c]:j

计数:2
打印 c:1
文本 [c]:o

计数:1
打印 c:2
文本 [c]:c

计数:0
打印 c:3
文本 [c]:a

原文:joca
反转:acoj

于 2014-11-26T00:36:20.990 回答
0

在不使用任何内置函数的情况下我能想到的方式:

a = 'word'
count = 0
for letter in a:
    count += 1

b = ''
for letter in a:
    b += a[count-1]
    count -= 1

如果你打印 b:

print b
drow
于 2014-10-30T23:15:44.543 回答
0

不是很聪明,但很棘手的解决方案

def reverse(t):
    for j in range(len(t) // 2):
        t = t[:j] + t[- j - 1] + t[j + 1:- j - 1] + t[j] + t[len(t) - j:]
    return t
于 2014-07-07T21:06:08.650 回答
0

你有足够的答案。

只是想分享另一种方式。

您可以编写两个小函数进行反向并将函数输出与给定字符串进行比较

变量 = ''

def 反向(数据):

for i in data:
    var = i + var
return var

如果不是 var == data :

打印“没有回文”

别的 :

打印“回文”

于 2013-11-28T06:53:24.313 回答
0

免积分:

from functools import partial
from operator import add

flip = lambda f: lambda x, y: f(y, x)
rev = partial(reduce, flip(add))

测试:

>>> rev('hello')
'olleh'
于 2014-07-09T21:17:46.473 回答
0

这是python 2.7语法中最简单的方法

def reverse(text):

      rev = ""
      final = ""

      for a in range(0,len(text)):
            rev = text[len(text)-a-1]
            final = final + rev
return final
于 2015-06-17T22:37:47.337 回答
0

我从 thecrazyprogrammer.com 获得了一个在 python 中反转字符串的示例:

string1 =  "IkNoWwHeReYoUlIvE"
string2 = ""

i = len(string1)-1

while(i>=0):
  string2 = string2 + string1[i]
  i = i-1

print("original = " + string1)
print("reverse  = " + string2)
于 2019-12-29T16:56:08.017 回答
0
enterString=input("Enter a string to be reversed:")
string_List=list(enterString)
revedString=[]

for i in range(len(string_List)):
    revedString.append(string_List.pop())
#Pop last element and append it to the empty list
print "reversed string is:",''.join(revedString)
#as the out come is in list convert it into string using .join

Sample Output:
>>>Enter a string to be reversed :sampleReverse1  
>>>reversed string is:1esreveRelpmas 
于 2016-06-03T10:38:44.207 回答
0

只需运行它,但它会将每个字符打印在单独的行中,第二个版本将其打印在一行中。

def rev(str):
        for i in range(0,len(str)):
            print(list(str)[len(str)-i-1])

打印一行:

def rev(str):
    rev = list()
    for i in range(0,len(str)):
        rev.append((list(str)[len(str)-i-1]))
    print(''.join(rev))
于 2017-12-03T19:47:17.533 回答
0

我更喜欢这是使用 for 循环反转字符串的最佳方式。

def reverse_a_string(str): 

    result=" "
    for i in range(len(str),1,-1):
        result= result+ str[i-1]
    return result

print reverse_a_string(input())
于 2017-06-12T03:46:02.470 回答
0
m = input("Enter string::")
def rev(s):
    z = -1
    x = len(s)
    while x != 0:
        print(s[z], end='')
        z = z-1
        x = x-1
rev(m)
于 2015-11-24T08:14:29.790 回答
0

您可以按照建议简单地使用 pop 。这是一个衬里

chaine = 'qwertyuiop'
''.join([chaine[-(x + 1)] for x in range(len(chaine))])
'poiuytrewq'
gg = list(chaine)
''.join([gg.pop() for _ in range(len(gg))])
'poiuytrewq'
于 2017-07-04T15:24:17.613 回答
0

简单的方法,

>>> a = "hi hello"
>>> ''.join([a[len(a)-i-1] for i,j in enumerate(a)])
'olleh ih'
>>> 
于 2017-10-02T11:32:22.193 回答
-1

我们可以先将字符串转换为列表,然后使用“.join”方法将字符串反转为再次将列表转换为单个字符串。

text="Youknowwhoiam"
lst=list(text)
lst.reverse()
print("".join(lst))

它将首先将 "youknowwhoiam" 转换为 ['Y', 'o', 'u', 'k', 'n', 'o', 'w', 'w', 'h', 'o', '我是']

之后它将列表反转为 ['m', 'a', 'i', 'o', 'h', 'w', 'w', 'o', 'n', 'k', 'u ', 'o', 'Y']

最后它将列表转换为单个单词“maiohwwonkuoY”

如需更多简要说明,只需运行以下代码:-

text="Youknowwhoiam"
lst=list(text)
print (lst)
lst.reverse()
print(lst)
print("".join(lst))
于 2016-09-18T21:20:45.210 回答
-3
__author__ = 'Sreedhar'
#find reverse of the string with out using index or reverse function?

def reverse(text):
    revs = ""
    for i in text:
        revs = i + revs
    return revs

strig = raw_input("enter anything:")

print reverse(strig)

#index method
print strig[::-1]
于 2016-08-30T02:02:43.073 回答
-8

反转字符串的最简单方法:

    backwards = input("Enter string to reverse: ")
    print(backwards[::-1])
于 2015-12-10T03:54:30.860 回答