不使用reverse()或[:: - 1]反转字符串?

时间:2013-09-08 17:56:45

标签: python string function for-loop reverse

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

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

我在Q& A风格中提出了以下解决方案,以防将来对人们有所帮助。

42 个答案:

答案 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步骤的

xrangerange将以相反的顺序返回项目,因此我们需要从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 ) )

或通过backward for loop

# 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)

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

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
文字[c]:j

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

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

数: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])