用于交换字符串中第一个和最后一个字母的Python代码

用于交换字符串中第一个和最后一个字母的Python代码,python,string,python-2.x,Python,String,Python 2.x,给定一个字符串,返回一个交换了第一个和最后一个字符的新字符串 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]] middl

给定一个字符串,返回一个交换了第一个和最后一个字符的新字符串

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)
现在,当我在计算机上用Python2.7运行此代码时,它似乎工作正常,但在code bat上运行时,我得到以下错误:“错误:列表索引超出范围”


现在我想我已经非常清楚这个错误的含义了,但我不明白为什么我会得到它,因为我引用的任何索引基本上都保证是至少2个字符的字符串

您的问题是1个字符,即前后('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) ])

您的问题是1个字符,即前后('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) ])

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

def front_back(string):
    if len(string) < 2:
        return string
    return string[-1] + string[1:-1] + string[0]
def前后(字符串):
如果len(字符串)<2:
返回字符串
返回字符串[-1]+字符串[1:-1]+字符串[0]

(作为旁注,不要对变量名使用
str
,因为它会影响
str
函数)。

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

def front_back(string):
    if len(string) < 2:
        return string
    return string[-1] + string[1:-1] + string[0]
def前后(字符串):
如果len(字符串)<2:
返回字符串
返回字符串[-1]+字符串[1:-1]+字符串[0]

(作为旁注,不要对变量名使用
str
,因为它会影响
str
函数)。

我假设网站使用一系列随机/伪随机字符来确定您的代码是否给出了正确的输出。如果是这样,则
len()==1的字符串将错误返回。i、 e.
'h'返回'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')

我假设网站使用一系列随机/伪随机字符来确定代码是否给出了正确的输出。如果是这样,则
len()==1的字符串将错误返回。i、 e.
'h'返回'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')

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

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

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

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

str[1:-1]
将超出
'a'
的范围,因为只有索引
[0]
[-1]
有效,即使用[0]替换[1],也会出现相同的错误。我知道如果中间值等于该索引范围,代码将无法正常工作,但我的观点是,它仍然会给我列表索引超出范围的错误。
str[1:-1]
将超出
'a'
的范围,因为只有索引
[0]
[-1]
有效,即使在用[0]替换[1]时也会得到相同的错误。我理解如果middle等于该索引范围,代码将无法正常工作,但我的观点是它仍然会给我列表索引超出范围的错误。当运行上述代码替换我的代码时,我得到以下错误:错误:只能连接列表(而不是“str”)对于列表,我认为这只是因为“中间”不是列表,所以我把它做成了一个列表,现在我得到了和以前一样的错误:“列表索引超出范围”我不知道这个网站运行的是什么版本的python,但这段代码在
python2,3
上运行得非常好。尽管如此,我还是更改了代码。这里有一个链接指向实践问题,以防有人想尝试:当运行上面的代码来替换我的代码时,我得到以下错误:错误:只能将列表(而不是“str”)连接到列表,我想这只是因为“middle”不是列表,所以我将其设置为一个,现在我得到的错误与以前相同:“列表索引超出范围”我不知道这个网站运行的是什么版本的python,但这段代码在
python2,3
上运行得非常好。尽管如此,我还是更改了代码。下面是一个链接,指向实践问题,以防有人想尝试它: