【问题标题】:Swap cases in a string在字符串中交换大小写
【发布时间】:2017-05-19 06:46:54
【问题描述】:

我正在尝试解决this challenge in hackerrank,它要求将所有小写字母转换为大写字母,反之亦然。

我尝试使用以下代码:

def swap_case(s):
    length = len(s)
    i=0
    while length:
        if s1[i].isupper():
            s[i].lower()
        elif s[i].islower():
            s[i].upper()
        length-=1
        i+=1
    return s

if __name__ == '__main__':
    s = input()
    result = swap_case(s)
    print(result)

但是返回的字符串与传递给函数的字符串相同。哪里错了?

【问题讨论】:

  • 字符串是不可变的。 s[i].upper() 返回s[i] 的大写“副本”,它不会修改s[i] 本身。您需要完全创建一个新的字符串对象...
  • 就像@Julien 提到的那样,您实际上并没有更改原始字符串。考虑使用另一个变量来保存每个新更新,并返回该新变量
  • 另外,对于它的价值,Python 已经有一个内置函数可以做到这一点:str.swapcase()
  • 这能回答你的问题吗? Swapping uppercase and lowercase in a string

标签: python string python-3.x


【解决方案1】:

内置的str.swapcase 已经这样做了。

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

【讨论】:

  • 工作迅速。谢谢。
【解决方案2】:

正如 cmets 和其他答案中所说,字符串是不可变的。

尝试以下操作:

s = input("Enter input: ")


def convert(ss):
    # Convert it into list and then change it
    newSS = list(ss)
    for i,c in enumerate(newSS):
        newSS[i] = c.upper() if c.islower() else c.lower()
    # Convert list back to string
    return ''.join(newSS)

print(s)
print(convert(s))

# Or use string build in method
print (s.swapcase())

【讨论】:

    【解决方案3】:
    def swap_case(s):
        new = ""
        for i in range(len(s)):
            if str.isupper(s[i]):
                new = new + str.lower(s[i])
    
            elif str.islower(s[i]):
                new = new + str.upper(s[i])
    
            else:
                new = new + str(s[i])
            
        return (new)
    
    if __name__ == '__main__':
        s = input()
        result = swap_case(s)
        print(result)
    

    【讨论】:

      【解决方案4】:

      正如@Julien 在评论upperlower 中所述,方法返回一个副本,并且不更改对象本身。见this docs

      编辑 @aryamccarthy 让我想起了 Python 中此类任务的现有功能:swapcase() 方法。查看更多here。请注意,这也会返回字符串的副本。

      【讨论】:

      • 我赞成您的评论,但不幸的是,这些评论没有任何声誉。
      • @Julien 考虑添加详细的答案。评论没有增加代表。
      • @Julien 如果您的话是作为问题的答案,也许您应该发布答案而不是评论问题。
      【解决方案5】:

      Python-3 内置的 swapcase 函数。

      def swap_case(s):
          return s.swapcase()
      
      if __name__ == '__main__':
          s = input()
          result = swap_case(s)
          print(result)
      

      输入:

      "Pythonist 3"
      

      输出:

      "pYTHONIST 3"
      

      【讨论】:

        【解决方案6】:
        def swap_case(s):
            return s.swapcase()
        
        #or you can use list comprehension 
        
        def swap_case(s):
            new=[ch.lower() if ch.isupper() else ch.upper() for ch in s]
            new=''.join(new)
            return new
        
        if __name__ == '__main__':
            s = input()
            result = swap_case(s)
            print(result)
        

        【讨论】:

        • 欢迎来到 SO!您可能会选择Tour,并且应该(重新)阅读帮助主题How to Answer,以了解如何做出贡献。您应该始终解释您的代码和答案,以便其他人可以从中受益。 “只是代码”的答案质量很差,将来可能会被删除,这会让你的工作完全没用。
        【解决方案7】:
        def swap_case(s):
            l = list(s)
            for i in range(len(s)):
                if l[i].islower():
                    l[i] = l[i].upper()
                else:
                    l[i] = l[i].lower()
            k = "".join(map(str,l))
            return k
        

        【讨论】:

        • 或者你也可以使用 return s.swapcase()
        • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
        • 欢迎来到 Stack Overflow。 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释代码的作用以及它如何回答问题,以便它对其他有类似问题的用户以及 OP 也很有用
        【解决方案8】:
        def swap_case(s):
            a=" "
            for i in s:
                if i==i.lower():
                    a=a+(i.upper())
                else:
                    a=a+(i.lower())
            return (a)
        

        【讨论】:

          【解决方案9】:

          试试这个

          def swap_case(s):
              l =[]
              str1 = ''
              for i in s:
                  if i.isupper():
          
                      l.append(i.lower())
                  elif i.islower():
                      l.append(i.upper())
                  else:
                      l.append(i)
              return (str1.join(l))
          if __name__ == '__main__':
              s = input()
              result = swap_case(s)
              print(result)
          

          【讨论】:

            【解决方案10】:
            import string
            
            upalf = string.ascii_uppercase
            
            lowalf = string.ascii_lowercase
            
            def swap_case(s):
                new = ""
                for i in s:
                    if i in upalf:
                        new += i.lower()
                    elif i in lowalf:
                        new += i.upper()
                    else:
                        new += i
                return new
            
            if __name__ == '__main__':
                s = input()
                result = swap_case(s)
                print(result)
            

            **在这个问题中,我使用了一个叫做“string”的模块,里面有属性有大写字母和小写字母**

            【讨论】:

              【解决方案11】:
              def swap_case(s):
                  list_s= list(s)
                  for index,char in enumerate(list_s):
                      if char == char.lower():
                          list_s[index] =char.upper()
                      else:
                          list_s[index]= char.lower()
                          s = ''.join(list_s)
                  return s
              
              string = 'HackerRank.com presents "Pythonist 2".'
              print(swap_case(string))
              

              【讨论】:

              • 最好为您在堆栈溢出上发布的代码添加描述。
              猜你喜欢
              • 1970-01-01
              • 2016-07-14
              • 1970-01-01
              • 2021-08-14
              • 1970-01-01
              • 2013-02-01
              • 1970-01-01
              • 2021-06-11
              • 2018-01-13
              相关资源
              最近更新 更多