反转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
循环, count
variables就会有意义
那么让我们来看看我们正在努力实现的基本版本:
将最后一个字符追加到列表中将会开始相反的顺序。 例如:
>>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,依此类推,直到没有更多的字符被添加到列表。 还记得我们上面的count
variables吗? 这将派上用场。 通过使用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
它不像人们提到的其他选项(或者内置方法)那么快,但是容易理解,因为我们只是简单地使用text
string的长度来连接一个字符,面前。
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
没有