【问题标题】:Python code to swap first and last letters in stringPython代码交换字符串中的第一个和最后一个字母
【发布时间】:2016-10-16 17:19:31
【问题描述】:

给定一个字符串,返回一个新字符串,其中第一个和最后一个字符已交换。

front_back('code') → 'eodc'
front_back('a') → 'a'
front_back('ab') → 'ba'

以上是我试图解决的 www.codingBat.com 上提供的问题之一,以下是我为此编写的代码。

def front_back(str):     
    str = list(str)
    first = [str[0]]
    last = [str[-1]]
    middle = str[1:-1]
    print ''.join (last + middle + first)

现在,当我在计算机上的 python 2.7 中运行此代码时,它似乎可以正常工作,但在代码 bat 上运行时,我收到以下错误:“错误:列表索引超出范围”

现在我想我对这个错误的含义有了一个很好的了解,但我不明白为什么我会得到它,因为我引用的任何索引基本上都保证在至少 2 个字符的字符串中.

【问题讨论】:

  • str[1:-1] 将超出'a' 的范围,因为只有索引[0][-1] 有效
  • 即使将 [0] 替换为 [1],我也会遇到相同的错误。我知道如果 middle 等于该索引范围,代码将无法按预期工作,但我的意思是它仍然给我列表索引超出范围错误。

标签: python string python-2.x


【解决方案1】:

您可能得到一个空字符串 ('') 的 IndexError,因为在这种情况下,str[0] 将超出范围。如所写,您的代码也会为 1 个字符的字符串生成无效结果。要修复它,您可以 return 原始字符串,如果它的长度小于 2。此外,使用字符串切片会更简单(更快):

def front_back(string):
    if len(string) < 2:
        return string
    return string[-1] + string[1:-1] + string[0]

(附带说明,不要使用str 作为变量名,因为它会影响built-in str 函数。

【讨论】:

    【解决方案2】:

    您的问题在于 1 个字符,即。 front_back('a') → 'a'。考虑如何调整函数以解决这种情况。

    编辑:我不喜欢其他答案的效率或普遍性,所以我将在下面发布我的解决方案:

    def front_back(str):
        return ''.join([x if i not in [0,len(str)-1] else str[len(str)-i-1] for i,x in enumerate(str) ])
    

    【讨论】:

      【解决方案3】:

      保持简单以避免特殊情况:

      def front_back(string):
          array = list(string)
          array[0], array[-1] = array[-1], array[0]
          return "".join(array)
      

      【讨论】:

        【解决方案4】:

        我假设网站使用一系列随机/伪随机字符来确定您的代码是否给出了正确的输出。如果是这样,那么len() == 1 的字符串将错误地返回。即'h' return 'hh'。我已修改代码以更正此问题。假设该网站还要求您返回数据而不是打印,我也考虑了这一点。祝你好运!

        def front_back(str):
            if len(str) > 1:
                str = list(str)
                first = [str[0]]
                last = [str[-1]]
                middle = str[1:-1]
                return ''.join (last + middle + first)
            else:
                return str
        
        print front_back('h')
        

        【讨论】:

        • 在运行上述代码代替我的代码时出现以下错误:错误:只能将列表(不是“str”)连接到我认为只是由于“中间”不是列表所以我做了一个,现在我得到和以前一样的错误:“列表索引超出范围”
        • 我不知道这个网站运行的是什么版本的python,但是这段代码在python2, 3上运行得很好。尽管如此,我还是更改了代码。
        • 这是练习题的链接,以防有人想尝试:codingbat.com/prob/p153599
        猜你喜欢
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2021-06-13
        • 2013-12-23
        • 2017-01-25
        • 2018-07-21
        • 1970-01-01
        相关资源
        最近更新 更多