[英]How to check if all words in the list are all caps in python
我想知道列表中的所有单词是否全部大写,即所有字母字符都大写。
我尝试用一个简单的字符串来理解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和最小的方式实现我想做的事情? (也许还有其他 function 只检查输入字符串中的所有字母单词是否都是大写字母,根本不关心特殊字符、数字和空字符串?还是我必须从头开始写一个?)
如文档中所述:
如果字符串中所有大小写字符都是大写且至少有一个大小写字符,则返回
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
和编译的正则表达式,可能会更有效率。
使用str.islower的否定:
sent = ['FDSFS','BBIBIFBIBWEF','ASDASD', '112','32:/']
result = [(not word.islower()) for word in sent]
print(result)
Output
[True, True, True, True, True]
isupper 的行为在文档中有解释:
如果字符串中所有大小写字符都是大写且至少有一个大小写字符,则返回 True,否则返回 False。
(强调我的)
一个大小写字符是:
大小写字符是那些具有一般类别属性的字符,它们是“Lu”(字母,大写)、“Ll”(字母,小写)或“Lt”(字母,titlecase)之一。
有关如何识别大小写字符的详细解释,请参见此处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.