我遇到了一个奇怪的Codecademy练习,它需要一个函数,它将一个字符串作为输入并以相反的顺序返回它。唯一的问题是你无法在stackoverflow [::-1]
上使用反向方法或常见答案。
显然在编程的现实世界中,很可能会使用extended slice方法,甚至使用reversed
函数,但也许有些情况下这不起作用?
我在Q& A风格中提出了以下解决方案,以防将来对人们有所帮助。
答案 0 :(得分:62)
您也可以使用递归来完成:
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
答案 1 :(得分:18)
另一种选择:
from collections import deque
def reverse(iterable):
d = deque()
d.extendleft(iterable)
return ''.join(d)
答案 2 :(得分:11)
使用反向range
:
def reverse(strs):
for i in xrange(len(strs)-1, -1, -1):
yield strs[i]
...
>>> ''.join(reverse('hello'))
'olleh'
带有-1步骤的 xrange
或range
将以相反的顺序返回项目,因此我们需要从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'
答案 3 :(得分:11)
修改强>
最近关于这个问题的活动让我回头看看,并使用发电机将我的解决方案改为快速单线:
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循环。
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
显然,这是在现实生活中需要的代码。使用反转函数或扩展切片将是完成此任务的最佳方法,但也许有一些实例,当它不起作用,你需要这个。无论哪种方式,我想我会分享给任何有兴趣的人。
如果你们有任何其他想法,我很乐意听到他们的声音!
答案 4 :(得分:7)
只编写Python几天,但我觉得这是一个相当干净的解决方案。创建一个空列表,遍历字符串中的每个字母并将其附加到列表的前面,将连接列表作为字符串返回。
def reverse(text):
backwardstext = []
for letter in text:
backwardstext.insert(0, letter)
return ''.join(backwardstext)
答案 5 :(得分:5)
我用过这个:
def reverse(text):
s=""
l=len(text)
for i in range(l):
s+=text[l-1-i]
return s
答案 6 :(得分: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
答案 7 :(得分:4)
受Jon的回答启发,这个怎么样
word = 'hello'
q = deque(word)
''.join(q.pop() for _ in range(len(word)))
答案 8 :(得分:3)
reduce(lambda x, y : y + x, "hello world")
答案 9 :(得分:3)
我在我的repo中创建了如何在python中反转字符串的不同版本: https://github.com/fedmich/Python-Codes/tree/master/Reverse%20a%20String
您可以使用list-comprehension或lambda technique:
来完成# 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) )
答案 10 :(得分:2)
Blender的答案很可爱,但对于一个很长的字符串,它会导致一个惊人的RuntimeError: maximum recursion depth exceeded
。有人可能会将相同的代码重构为while循环,因为人们经常必须在python中进行递归。由于时间和内存问题,显然仍然很糟糕,但至少不会出错。
def reverse(text):
answer = ""
while text:
answer = text[0] + answer
text = text[1:]
return answer
答案 11 :(得分:2)
我刚刚在代码学院解决了这个问题,并且正在检查我的答案并查看了此列表。因此,对python的理解非常有限,我刚刚做了这个并且它接合工作了。
def reverse(s):
i = len(s) - 1
sNew = ''
while i >= 0:
sNew = sNew + str(s[i])
i = i -1
return sNew
答案 12 :(得分:2)
def reverse(s):
return "".join(s[i] for i in range(len(s)-1, -1, -1))
答案 13 :(得分:2)
高尔夫版本:r=lambda x:"".join(x[i] for i in range(len(x-1),-1,-1))
。
答案 14 :(得分:1)
这是一个使用列表作为堆栈:
Flask-Security
答案 15 :(得分: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)
答案 16 :(得分:1)
你可以这样做
def rev(str):
rev = ""
for i in range(0,len(str)):
rev = rev + str[(len(str)-1)-i]
return rev
答案 17 :(得分:1)
这是我在范围循环中使用for i的解决方案:
def reverse(string):
tmp = ""
for i in range(1,len(string)+1):
tmp += string[len(string)-i]
return tmp
这很容易理解。我从1开始,以避免索引超出范围。
答案 18 :(得分:1)
def reverseThatString(theString):
reversedString = ""
lenOfString = len(theString)
for i,j in enumerate(theString):
lenOfString -= 1
reversedString += theString[lenOfString]
return reversedString
答案 19 :(得分:1)
您可以简单地从最后一个字符开始反向迭代字符串。使用python,您可以使用列表推导以相反的顺序构造字符列表,然后将它们连接起来以获得一行的反向字符串:
def reverse(s):
return "".join([s[-i-1] for i in xrange(len(s))])
如果您甚至不允许使用否定索引,则应将s[-i-1]
替换为s[len(s)-i-1]
答案 20 :(得分:1)
你已经收到了很多其他答案,但只是为了添加另一个简单的解决方案 - 首先想到的是这样的事情:
def reverse(text):
reversed_text = ""
for n in range(len(text)):
reversed_text += text[-1 - n]
return reversed_text
它没有人们提到的其他选项(或内置方法)那么快,但很容易理解,因为我们只是使用text
字符串的长度来一次连接一个字符通过从末端向前切片。
答案 21 :(得分:1)
我所做的所有实现反向字符串的方法是使用xrange
函数和for循环中字符串的长度,然后按以下步骤退一步:
myString = "ABC"
for index in xrange(len(myString),-1):
print index
我的输出是“CBA”
答案 22 :(得分:1)
def reverse(text):
a=""
l=len(text)
while(l>=1):
a+=text[l-1]
l-=1
return a
我只是将字符串a连接到文本的最高索引(每个循环继续递减1次)。
答案 23 :(得分:1)
我刚刚解决了对codeacademy的相应练习,并希望将我的方法与其他方法进行比较。我还没有找到我到目前为止使用的解决方案,所以我想我在这里注册并向其他人提供我的解决方案。也许我会就如何改进代码得到建议或有用的评论。
好了,好吧,我没有使用任何列表存储字符串,而是刚刚访问了字符串索引。我最初花了一点时间来处理len()和索引号,但最终它起作用了:)。
def reverse(x):
reversestring = ""
for n in range(len(str(x))-1,-1, -1):
reversestring += x[n]
return reversestring
我仍然想知道reversestring = ""
能否以更优雅的方式解决,或者甚至是“坏风格”,但到目前为止我找不到答案。
答案 24 :(得分:1)
这是一种使用while循环的方法:
def reverse(s):
t = -1
s2 = ''
while abs(t) < len(s) + 1:
s2 = s2 + s[t]
t = t - 1
return s2
答案 25 :(得分: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")))
答案 26 :(得分:0)
您可以根据建议使用pop。 这里有一个内衬
<profile>
<id>openshift</id>
<properties>
<axis2.repo.path>/opt/eap/custom_modules</axis2.repo.path>
<ssl.cacerts.java.path>${java.home}/lib/security/cacerts</ssl.cacerts.java.path>
</properties>
<build>
<resources>
<resource>
<directory>/src/webapp/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<copy todir="${jboss.deploy.path}">
<fileset dir="${compiled.war.location}"/>
</copy>
<echo>war copied to ${jboss.deploy.path}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
答案 27 :(得分: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())
答案 28 :(得分:0)
简单方法,
>>> a = "hi hello"
>>> ''.join([a[len(a)-i-1] for i,j in enumerate(a)])
'olleh ih'
>>>
答案 29 :(得分: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)
答案 30 :(得分: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))
答案 31 :(得分: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
答案 32 :(得分: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)
答案 33 :(得分:0)
test.zt
答案 34 :(得分:0)
我的解决方案:
s = raw_input(&#34;输入字符串&#34;)
打印
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
反方向(S)
结果屏幕
输入字符串joca
文字长度:4
数:3 打印c:0数:0
打印c:3
文字[c]:a
原文:joca
逆转:acoj
无
答案 35 :(得分: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
答案 36 :(得分:0)
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'
答案 37 :(得分: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
答案 38 :(得分:0)
你有足够的答案。
只想分享另一种方式。
你可以为反向写一个两个小函数,并将函数输出与给定的字符串进行比较
var =''
def reverse(数据):
for i in data:
var = i + var
return var
如果不是var == data:
打印“没有回文”
其他:
打印“回文”
答案 39 :(得分:-1)
我们可以先将字符串转换为列表,然后在使用“.join”方法后将字符串反转,再次将列表转换为单个字符串。
text="Youknowwhoiam"
lst=list(text)
lst.reverse()
print("".join(lst))
首先将“youknowwhoiam”转换为['Y','o','u','k','n','o','w','w','h','o ','我','a','m']
它会将列表反转为['m','a','i','o','h','w','w','o','n','k' ,'你','o','Y']
最后它将列表转换为单个单词“maiohwwonkuoY” “
如需更多解释,请运行以下代码: -
text="Youknowwhoiam"
lst=list(text)
print (lst)
lst.reverse()
print(lst)
print("".join(lst))
答案 40 :(得分:-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]
答案 41 :(得分:-8)
最简单的方法来反转字符串:
backwards = input("Enter string to reverse: ")
print(backwards[::-1])