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

Posted

技术标签:

【中文标题】不使用 reversed() 或 [::-1] 反转字符串?【英文标题】:Reverse a string without using reversed() or [::-1]? 【发布时间】:2013-09-12 06:29:54 【问题描述】:

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

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

我在下面以问答形式提出一个解决方案,以防将来对人们有所帮助。

【问题讨论】:

【参考方案1】:

试试这个简单而优雅的代码。

my_string= "sentence"
new_str = ""
for i in my_string:
    new_str = i + new_str
print(new_str)

【讨论】:

不要将str 用于变量,因为它已经是 Python 关键字列表的一部分。尝试使用new_string【参考方案2】:

我从 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)

【讨论】:

【参考方案3】:

只需运行它,但它会将每个字符打印在单独的行中,第二个版本将其打印在一行中。

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

【讨论】:

【参考方案4】:

简单的方法,

>>> a = "hi hello"
>>> ''.join([a[len(a)-i-1] for i,j in enumerate(a)])
'olleh ih'
>>> 

【讨论】:

【参考方案5】:

您可以按照建议简单地使用 pop。 这是一种衬里

chaine = 'qwertyuiop'
''.join([chaine[-(x + 1)] for x in range(len(chaine))])
'poiuytrewq'
gg = list(chaine)
''.join([gg.pop() for _ in range(len(gg))])
'poiuytrewq'

【讨论】:

【参考方案6】:

我更喜欢这是使用 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())

【讨论】:

【参考方案7】:

这是一个使用列表作为堆栈的例子:

def reverse(s):
  rev = [_t for _t in s]
  t = ''
  while len(rev) != 0:
    t+=rev.pop()
  return t

【讨论】:

【参考方案8】:

我们可以先将字符串转换为列表,然后将字符串反转,然后使用“.join”方法再次将列表转换为单个字符串。

text="Youknowwhoiam"
lst=list(text)
lst.reverse()
print("".join(lst))

它将首先将“youknowwhoiam”转换为['Y', 'o', 'u', 'k', 'n', 'o', 'w', 'w', 'h', 'o ', 'i', 'a', 'm']

之后它将列表反转为 ['m', 'a', 'i', 'o', 'h', 'w', 'w', 'o', 'n', 'k' , 'u', 'o', 'Y']

最后它将列表转换为单个单词“maiohwwonkuoY "

要获得更多简要说明,只需运行以下代码:-

text="Youknowwhoiam"
lst=list(text)
print (lst)
lst.reverse()
print(lst)
print("".join(lst))

【讨论】:

【参考方案9】:
__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]

【讨论】:

【参考方案10】:
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 

【讨论】:

【参考方案11】:

反转字符串的最简单方法:

    backwards = input("Enter string to reverse: ")
    print(backwards[::-1])

【讨论】:

问题说“没有使用reverse或[::-1] 我最初的查询是如何反转一个字符串,这就是我被引导的地方。【参考方案12】:
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)

【讨论】:

【参考方案13】:

你可以这样做

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

【讨论】:

【参考方案14】:

Blender 的回答很可爱,但是对于很长的字符串,它会产生惊人的RuntimeError: maximum recursion depth exceeded。可以将相同的代码重构为一个 while 循环,就像 Python 中的递归经常必须做的那样。由于时间和内存的问题,显然仍然很糟糕,但至少不会出错。

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

【讨论】:

【参考方案15】:

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

def reverse(text):

      rev = ""
      final = ""

      for a in range(0,len(text)):
            rev = text[len(text)-a-1]
            final = final + rev
return final

【讨论】:

【参考方案16】:
reduce(lambda x, y : y + x, "hello world")

【讨论】:

【参考方案17】:
def reverse(s):
    return "".join(s[i] for i in range(len(s)-1, -1, -1))

【讨论】:

【参考方案18】:

这是我的贡献:

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)

【讨论】:

【参考方案19】:

这是我使用 for i in range 循环的解决方案:

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

这很容易理解。我从 1 开始以避免索引超出范围。

【讨论】:

【参考方案20】:
def reverseThatString(theString):
    reversedString = ""
    lenOfString = len(theString)
    for i,j in enumerate(theString):
        lenOfString -= 1
        reversedString += theString[lenOfString]
    return reversedString

【讨论】:

【参考方案21】:

我的解决方案:

s = raw_input("输入字符串") 打印 def 反向(文本):

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  

反向

结果屏幕

输入字符串 joca

文字长度:4

计数:3 打印 c: 0 文本[c]: j

计数:2 打印 c: 1 文本[c]: o

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

计数:0 打印 c: 3 文本[c]:一个

原文:joca 反转:acoj 无

【讨论】:

【参考方案22】:

不使用任何内置函数我能想到的方式:

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

【讨论】:

【参考方案23】:

您收到了很多替代答案,但只是添加另一个简单的解决方案——首先想到的是这样的:

def reverse(text):
    reversed_text = ""   

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

    return reversed_text

它没有人们提到的其他一些选项(或内置方法)那么快,但很容易理解,因为我们只是使用 text 字符串的长度通过切片一次连接一个字符从末端到前面。

【讨论】:

+1 甚至不知道你可以做到这一点,或者我曾经做过,我只是在 4 或 5 个月内没有使用 Python。不管怎样,干得好【参考方案24】:

我用过这个:

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

【讨论】:

最简单也是最快的之一!【参考方案25】:

无积分:

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'

【讨论】:

【参考方案26】:

只用了几天的 Python 代码,但我觉得这是一个相当干净的解决方案。创建一个空列表,遍历字符串中的每个字母并将其附加到列表的前面,将连接的列表作为字符串返回。

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

【讨论】:

【参考方案27】:

您可以简单地从最后一个字符开始反向迭代您的字符串。使用python,您可以使用列表推导以相反的顺序构造字符列表,然后将它们连接起来以单行方式获取反转的字符串:

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

如果您甚至不允许使用负索引,则应将 s[-i-1] 替换为 s[len(s)-i-1]

【讨论】:

【参考方案28】:

你也可以用递归来做:

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

【讨论】:

迄今为止最好的答案。如果不使用其有用的结构,Python 不适合这种低级编程,但如果必须的话,这是迄今为止最好的方法。 我认为这个解决方案需要 O(n^2) 内存......这对于长字符串来说可能非常糟糕。 @EmanuelePaolini:[::-1] 是您唯一应该使用的东西。所有这些答案只是反转字符串的不同方式,没有速度保证。 @ChrisPurrone:递归函数并没有真正“循环”字符串(在 CPython 中)。每次调用函数时,都会创建一个堆栈帧(其中包含局部变量和函数的返回值)。您的函数是递归的,因此每次 return 都会创建一个新的堆栈框架,但由于返回值取决于另一个函数的返回值,旧的堆栈框架仍然需要保留。这就是为什么我写了+ h 的长链。它们直到最后才真正连接起来,也就是最后一个函数调用返回一个字符串的时候。 @ChrisPurrone:CPython 根本不做任何递归优化(据我所知)。事实上,CPython 甚至没有优化尾递归函数,它可以很容易地转化为等效的迭代函数。【参考方案29】:

不是很聪明,但很棘手

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

【讨论】:

如果您可以在这样的答案上添加更多信息,对 OP 来说会更好。其他关注这一点的人都将受益。 同意@deepend 我也喜欢这个答案,它类似于 K&R 的 C 编程语言书中的做法【参考方案30】:

我为实现反向字符串所做的只是在 for 循环中使用 xrange 函数和字符串的长度,然后按照以下步骤后退:

myString = "ABC"

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

我的输出是“CBA”

【讨论】:

以上是关于不使用 reversed() 或 [::-1] 反转字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Django admin argument to reversed() must be a sequence

Python初识之内置函数二

python学习日记:day16-------内置函数与匿名函数

2:如何反序迭代一个序列(字符串,列表,元组)

20-python基础-python3-reversed()函数

sort sorted() reverse() reversed() 的区别1