在Python中交换字母大小写

时间:2017-11-22 21:55:27

标签: python case-sensitive

一直试图从Java过渡到Python,但是我在编写迭代字符串的循环时遇到了困难 如您所见,我尝试访问每个索引以检查其大小写。如果那封信是大写的,那么我们将其小写,反之亦然 如果我已经对该特定索引进行了更改,我不确定为什么它会返回一个未更改的字符串

def swap_case(s):

    for x in range(len(s)):
        if s[x].isupper():
            s[x].lower() 
        if s[x].islower():
            s[x].upper()

    return s

6 个答案:

答案 0 :(得分:3)

如果s是字符串,您可以执行以下操作:

def swap_case(s):
    return s.swapcase()

话虽如此,如果您正在做的事情,我认为您不需要创建一个函数。您只需在字符串上调用.swapcase(),而不是将其传递给函数。

答案 1 :(得分:1)

在Python中,字符串是不可变的。因此,您可以将列表理解与.join

一起使用
def swap_case(s):
   return ''.join([i.lower() if i.isupper() else i.upper() for i in s])

答案 2 :(得分:1)

对于递归解决方案:

def swap_case(s):
    if not s:  # empty string
        return s
    head, tail = s[0], s[1:]
    if head.isupper():
        return head.lower() + swap_case(tail)
    else:
        return head.upper() + swap_case(tail)

这在Python中并不理想(通常在引擎盖下实现递归),但对于合理大小的字符串来说并不是那么糟糕。

答案 3 :(得分:0)

正如评论所提到的,s[x].lower()返回一个新字符串,由于字符串是不可变的,因此无法分配。所以你需要积累一个新的字符串。

def swap_case(s):
    s0 = ""
    for x in range(len(s)):
        if s[x].isupper():
            s0 += s[x].lower() 
        elif s[x].islower():
            s0 += s[x].upper()
    return s0

你也可以用lambda迭代它,这将更简洁。

def swap_case(s):
    s0 = map(lambda x: x.lower() if x.isupper() else x.upper(), s)
    return ''.join(s0)

答案 4 :(得分:0)

在python中,你不需要遍历像for x in range(len(s))这样的字符串。相反,python可以更简洁for char in message。此外,if子句看起来应该跟elifelse(非字母字符)。下面的代码适用于短消息,因为+=每次都会重新发送字符串,因为它是一个不可变类型。如果这会影响您的计划速度,请考虑使用str.join()

def swap_case(message):
    swapped_message = ''
    for char in message:
        if char.isupper():
            swapped_message += char.lower()
        elif char.islower():
            swapped_message += char.upper()
        else:
            swapped_message += char
    return swapped_message

答案 5 :(得分:0)

请参阅代码中的以下两条陈述:

s[x].lower()
s[x].upper()

s[x] NOT 这个(你可能认为):

+------+------+-----+------+-----+-------------+
| s[0] | s[1] | ... | s[x] | ... | s[len(s)-1] |
+------+------+-----+------+-----+-------------+
                      ^^^^

但是 new 1个字符的字符串只包含原始字符串x中的s th 字符:

+------+------+-----+------+-----+-------------+
| s[0] | s[1] | ... | s[x] | ... | s[len(s)-1] |
+------+------+-----+------+-----+-------------+

                   copy of s[x] 
             (another place in the memory):
                    +------+
                    |      |
                    +------+
                      ^^^^

as 不允许更改字符串中的字符

所以你改变了 1个字符的字符串的情况,保持原始字符串s不变。

注意:

s = "apple"
s = "orange"

完全没问题 - 第二个语句没有将 "apple"更改为"orange",但创建了新字符串 "orange"内存中的其他位置,然后s 标记这个新位置(...最初是字符串“apple”的标签) 。