反转string而不使用反转()或?

我遇到了一个奇怪的Codecademy练习,需要一个函数,将string作为input,并以相反的顺序返回。 唯一的问题是你不能在这里使用颠倒的方法或常用的答案, [::-1]

显然,在编程的真实世界中,人们很可能会使用扩展分片方法,或者甚至使用reversed函数,但是在某些情况下这可能不起作用。

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

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

 def reverse(text): if len(text) <= 1: return text return reverse(text[1:]) + text[0] 

和一个简单的例子,stringhello

  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 

另一个select:

 from collections import deque def reverse(iterable): d = deque() d.extendleft(iterable) return ''.join(d) 

使用反转的range

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

xrange或-1 range将以相反的顺序返回项目,所以我们需要从len(string)-1迭代到-1 (独占)并逐个从string中获取项目。

 >>> 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' 

编辑

最近在这个问题上的活动让我回头看看,并使用一个生成器将我的解决scheme更改为快速单线程:

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

虽然显然这里有一些更好的答案,如范围或xrange函数中的负面步骤。 以下是我原来的解决scheme:


这是我的解决scheme,我会一步一步解释

 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循环之前我需要列表,你会明白为什么它需要在一秒钟之内)。

一旦进入for循环, countvariables就会有意义

那么让我们来看看我们正在努力实现的基本版本:

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

 >>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()转换回string。 但是有一个问题。 这适用于单词foo,它甚至适用于任何长度为3个字符的单词。 但是5个字的单词呢? 或10个字符? 现在它不会工作。 如果有什么方法可以dynamic地改变我们追加的索引,那么任何单词都会以相反的顺序返回?

input循环。

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

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

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

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

事实上,它的基本概念是完全一样的:

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

那么中间所做的是什么呢?

那么,我们需要首先将最后一个字母的索引追加到我们的列表中,即单词text的长度为-1。 从现在起我们将它称为l​​(t)-1

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

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

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

现在我们有了我们的function的核心,让我们看看到目前为止:

 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']

我们不想要一个列表,我们需要一个string。 我们可以这样使用.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 

显然,这是更多的代码比现实生活中的必要条件。 使用反转函数或扩展片将是完成这个任务的最佳方式,但也许有一些情况下,它不会工作,你会需要这个。 无论如何,我想我会分享给任何有兴趣的人。

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

只编写了Python几天,但我觉得这是一个相当干净的解决scheme。 创build一个空列表,遍历string中的每个字母并将其附加到列表的前面,以stringforms返回联合列表。

 def reverse(text): backwardstext = [] for letter in text: backwardstext.insert(0, letter) return ''.join(backwardstext) 

受Jon的回答启发,这个怎么样?

 word = 'hello' q = deque(word) ''.join(q.pop() for _ in range(len(word))) 

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

 >>> 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()对其进行sorted() 。 最后,把它放在一起

我用这个:

 def reverse(text): s="" l=len(text) for i in range(l): s+=text[l-1-i] return s 

我创build了不同版本的如何在我的回购中反转python中的string: 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 ) ) 

或者做一个向后的循环

 # 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) ) 
 reduce(lambda x, y : y + x, "hello world") 

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

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

 def reverse(s): i = len(s) - 1 sNew = '' while i >= 0: sNew = sNew + str(s[i]) i = i -1 return sNew 
 def reverse(s): return "".join(s[i] for i in range(len(s)-1, -1, -1)) 

Blender的答案是可爱的,但是对于一个很长的string来说,会导致一个令人震惊的RuntimeError: maximum recursion depth exceeded 。 有人可能会将相同的代码重构成一个while循环,因为经常需要用python进行recursion。 由于时间和内存问题显然仍然不好,但至less不会出错。

 def reverse(text): answer = "" while text: answer = text[0] + answer text = text[1:] return answer 

今天我被要求在笔和纸上做同样的练习,所以我想出了这个列表的function:

 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")))string一起使用"".join(rev(list("hello")))

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

 def reverse(s): t = -1 s2 = '' while abs(t) < len(s) + 1: s2 = s2 + s[t] t = t - 1 return s2 

我也刚刚解决了codeacademy的相关练习,并想把我的方法与其他方法进行比较。 到目前为止,我还没有find我所使用的解决scheme,所以我想我在这里注册并向其他人提供解决scheme。 也许我会得到一个关于如何改进代码的build议或有用的评论。

确定在这里,我没有使用任何列表来存储string,而是我刚刚访问了string索引。 起初,我花了一点时间来处理len()和索引号,但最后它工作:)。

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

我仍然想知道是否可以用更优雅的方式来解决reversestring = "" ,甚至是“坏风格”,但是到目前为止我还找不到答案。

 def reverse(text): a="" l=len(text) while(l>=1): a+=text[l-1] l-=1 return a 

我只是串联了一个文本索引最高的string(每个循环每次递减1)。

我所做的实现反向string的方法是在for循环中使用带有string长度的xrange函数,并按以下步骤返回:

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

我的输出是“CBA”

你可以简单地从最后一个字符开始反转你的string。 使用python,你可以使用list comprehension来构造相反顺序的字符列表,然后连接它们来得到一个单行的反转string:

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

如果你不允许使用负索引,你应该用s[len(s)-i-1]replaces[-i-1] s[len(s)-i-1]

你已经收到了很多其他的答案,但只是添加另一个简单的解决scheme – 首先想到这样的事情:

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

它不像人们提到的其他选项(或者内置方法)那么快,但是容易理解,因为我们只是简单地使用textstring的长度来连接一个字符,面前。

 def reverseThatString(theString): reversedString = "" lenOfString = len(theString) for i,j in enumerate(theString): lenOfString -= 1 reversedString += theString[lenOfString] return reversedString 

这是我的解决scheme使用for我在范围循环:

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

这很容易理解。 我从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) 

你可以这样做

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

你有足够的答案。

只是想分享另一种方式。

你可以写一个两个小函数进行反转,并将函数输出与给定的string进行比较

var =''

反向(数据):

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

如果不是var ==数据:

打印“无回文”

其他:

打印“回文”

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

 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 

Pointfree:

 from functools import partial from operator import add flip = lambda f: lambda x, y: f(y, x) rev = partial(reduce, flip(add)) 

testing:

 >>> rev('hello') 'olleh' 

我可以想到的方式,而不使用任何内置函数:

 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 

我的解决scheme

s = raw_input(“inputstring”)
打印
反向(文本):

 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 

反方向(S)

结果屏幕

inputstringjoca

正文:4

数:3
打印c:0
文字[c]:j

数:2
打印c:1
文字[c]:o

数:1
打印c:2
文字[c]:c

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

原文:joca
逆转:acoj
没有