【问题标题】:How to check if all words in the list are all caps in python如何检查列表中的所有单词是否都是python中的大写字母
【发布时间】:2021-10-10 09:06:28
【问题描述】:

我想知道列表中的所有单词是否全部大写,即所有字母字符都大写。

我尝试了一个简单的字符串来理解isupper()的行为:

>>> 'FDSFS BBIBIFBIBWEF ASDASD 112,32:/'.isupper()    
True

所以我把那句话中的单词分成列表:

>>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
>>> all([word.isupper() for word in sent])
False

所以我检查了 all() 包含的参数列表:

>>> [word.isupper() for word in sent]
[True, True, True, False, False]

奇怪的是,isupper() 对于不包含字母的字符串(仅由数字和特殊字符组成)返回 False,但如果这些字符串甚至包含一个大写字符,则返回 True

>>> '123'.isupper()
False
>>> '123A'.isupper()
True
>>> '123?A'.isupper()
True
>>> '123?'.isupper()
False
>>> ''.isupper()
False

Q1.isupper() 的这种行为背后是否有任何设计决策?
Q2.我怎样才能以最 Pythonic 的方式实现我想做的事情和最小的方式? (也许有任何其他函数只检查输入字符串中的所有字母单词是否都是大写字母,并且根本不关心特殊字符、数字和空字符串?还是我必须从头开始写一个?)

【问题讨论】:

    标签: python string list


    【解决方案1】:

    第一季度:

    docs中提到的:

    如果字符串中的所有大小写字符都是大写并且至少有一个大小写字符,则返回True,否则返回False

    如您所见,它正在检查字符串中的所有字符是否都是大写的,而不仅仅是字母。

    这是一个类似的实现:

    import string
    def upper(s):
        notlower = all([word not in string.ascii_lowercase for word in s])
        anyupper = any([word in string.ascii_uppercase for word in s])
        return notlower and anyupper
    print(upper(s))
    

    第二季度:

    解决方案 1:

    解决这个问题的方法可能是使用upper 并检查它是否等同于原始字符串:

    >>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
    >>> all([word.upper() == word for word in sent])
    True
    >>> 
    

    解决方案 2:

    或者检查是否没有小写字符:

    >>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
    >>> all([(not word.islower()) for word in sent])
    True
    >>> 
    

    刚刚意识到@DaniMesejo 发布了这个,感谢他。

    解决方案 3:

    这也可以用正则表达式非常优雅地完成:

    >>> import re
    >>> sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
    >>> expr = re.compile('^[^a-z]*$')
    >>> all(map(expr.search, sent))
    True
    >>> 
    

    使用map 和编译的正则表达式,可能会更有效。

    【讨论】:

      【解决方案2】:

      使用str.islower的否定:

      sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
      result = [(not word.islower()) for word in sent]
      print(result)
      

      输出

      [True, True, True, True, True]
      

      isupper 的行为在文档中有解释:

      如果字符串中的所有大小写字符都是大写并且 至少有一个大小写字符,否则为 False。

      (强调我的)

      一个大小写的字符是:

      大写字符是一般类别属性是其中之一的字符 “Lu”(字母,大写),“Ll”(字母,小写)或“Lt”(字母, 标题)。

      请参阅here,了解有关如何识别大小写字符的详细说明。

      【讨论】:

        猜你喜欢
        • 2012-10-09
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多