我碰到的是要求会采取一个字符串作为输入,并以相反的顺序返回它的函数一个奇怪的Codecademy网站的锻炼。 唯一的问题是你不能使用反向方法或常见的答案在这里计算器, [::-1]
显然,在编程的现实世界中,一个最有可能与去扩展切片法,甚至使用reversed
功能,但也许有一些情况下这是行不通的?
我在Q&A的风格呈现解决方案如下,如果它是人们对未来有帮助的。
我碰到的是要求会采取一个字符串作为输入,并以相反的顺序返回它的函数一个奇怪的Codecademy网站的锻炼。 唯一的问题是你不能使用反向方法或常见的答案在这里计算器, [::-1]
显然,在编程的现实世界中,一个最有可能与去扩展切片法,甚至使用reversed
功能,但也许有一些情况下这是行不通的?
我在Q&A的风格呈现解决方案如下,如果它是人们对未来有帮助的。
你也可以用递归做到这一点:
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
只是另一种选择:
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
或range
为-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'
编辑
在这个问题上最近的活动使我回过头来,用发电机改变我解决一个快速班轮:
rev = ''.join([text[len(text) - count] for count in xrange(1,len(text)+1)])
虽然明明有这里有一些更好的答案就像范围或功能的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 i in range(0,len(text)):
lst.append(text[len(text)-count])
count += 1
首先,它是必要使用in range()
而不是仅仅in
,因为我们需要通过在单词中的字符进行迭代,但我们也需要拉字的索引值,使我们改变顺序。
我们的身体循环的第一部分应该很熟悉。 它非常类似于
>>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
我们几乎完成了! 现在,如果我们调用我们的功能字“你好”,我们会得到一个看起来像列表:
[ '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
仅此而已。 如果我们呼吁反向()字“你好”,我们会得到这样的:
>>print reverse('hello')
olleh
显然,这是方式更多的代码比在现实生活中的情况是必要的。 使用反向功能或扩展的片断将完成这一任务的最佳方法,但也许有一些实例时,它不会工作,你就需要这个。 无论哪种方式,我想我会分享它的人会是谁感兴趣。
如果你们有任何其他想法,我很想听听他们!
只有被编码的Python了几天,但我觉得这是一个相当干净的解决方案。 通过串中的每个字母创建一个空的列表,循环和其追加到列表的前面,返回加入列表作为字符串。
def reverse(text):
backwardstext = []
for letter in text:
backwardstext.insert(0, letter)
return ''.join(backwardstext)
我用这个:
def reverse(text):
s=""
l=len(text)
for i in range(l):
s+=text[l-1-i]
return s
由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()
最后,只是把它一起回str
我创建了不同版本的如何扭转Python中的字符串在我的回购: https://github.com/fedmich/Python-Codes/tree/master/Reverse%20a%20String
您可以通过使用列表理解或做拉姆达技术 :
# 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) )
reduce(lambda x, y : y + x, "hello world")
甲golfed版本: 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的答案是可爱的,但对于一个很长的字符串,它会导致高达RuntimeError: maximum recursion depth exceeded
。 有人可能会重构相同的代码为while循环,作为一个经常必须在Python递归做。 显然仍然很糟糕,由于时间和内存的问题,但至少不会出错。
def reverse(text):
answer = ""
while text:
answer = text[0] + answer
text = text[1:]
return answer
今天有人问我,在笔和纸本同样的工作,所以我想出这个功能列表:
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")))
这是一种while循环做到这一点:
def reverse(s):
t = -1
s2 = ''
while abs(t) < len(s) + 1:
s2 = s2 + s[t]
t = t - 1
return s2
我也刚刚解决了上codeacademy的coresponding锻炼,想比较我的做法给他人。 我还没有找到我迄今为止所使用的解决方案,所以我想我在这里注册,并提供我的解决方案给他人。 也许我得到一个建议,或者对如何提高代码有帮助的评论。
好吧这里有云,我没有使用任何列表存储字符串,而不是我刚刚访问字符串索引。 我花了一点首先要处理的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
我只是串联起来的文本指数最高(这使通过各1个循环递减)的字符串。
我所做的一切,实现了反向串使用xrange
函数的字符串的长度在for循环中,每个以下退一步:
myString = "ABC"
for index in xrange(len(myString),-1):
print index
我的输出为“CBA”
你可以简单地逆转迭代您的字符串从最后一个字符开始。 与Python,您可以使用列表中理解,构建以相反的顺序字符的列表,然后加入他们的行列,以获得一个班轮颠倒字符串:
def reverse(s):
return "".join([s[-i-1] for i in xrange(len(s))])
如果你不能使用,甚至负分度应更换s[-i-1]
与s[len(s)-i-1]
你已经收到了很多的备选答案,但只是为了添加另一个简单的解决方案 - 来考虑这样的事的第一件事:
def reverse(text):
reversed_text = ""
for n in range(len(text)):
reversed_text += text[-1 - n]
return reversed_text
这不是一样快,一些人提到(或内置的方法)的其他选项,但很容易因为我们只是使用的长度遵循text
由朝结束切片串在一个时间来连接一个字符面前。
def reverseThatString(theString):
reversedString = ""
lenOfString = len(theString)
for i,j in enumerate(theString):
lenOfString -= 1
reversedString += theString[lenOfString]
return reversedString
这是使用了我我的解决方案在范围内循环:
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
下面是一个使用列表作为堆栈:
def reverse(s):
rev = [_t for _t in s]
t = ''
while len(rev) != 0:
t+=rev.pop()
return t
你已经有足够的答案。
想和大家分享的另一种方式。
你可以写反面的两个小的功能和作用与输出给定的字符串比较
是=“”
DEF反向(数据):
for i in data:
var = i + var
return var
如果不是VAR ==数据:
打印“没有回文”
其他:
打印“回文”
不是很聪明,但棘手的解决方案
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))
测试:
>>> 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