想知道列表中的单词是否全部大写,即字母字符全部大写。
我尝试用一个简单的字符串来理解 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 和最小的方式实现我想做的事情? (也许有任何其他函数只检查输入字符串中的所有字母单词是否都是大写的,而根本不关心特殊字符、数字和空字符串?还是我必须从头开始写一个?)
最佳答案
问题1:
如 docs 中所述:
Return
True
if all cased characters in the string are uppercase and there is at least one cased character,False
otherwise.
如您所见,它正在检查字符串中的所有字符是否都是大写字母,而不仅仅是字母。
这是一个类似的实现:
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))
问题2:
解决方案一:
解决这个问题的方法可能是使用 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
和编译的正则表达式,可能会更有效率。
关于python - 如何检查列表中的所有单词是否都是python中的大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69513800/