如何检查对象是否是字符串列表?我只能检查对象是否为字符串:
def checktype(obj):
if isinstance(obj,str):
print "It's a string"
obj1 = ['foo','bar','bar','black','sheet']
obj2 = [1,2,3,4,5,'bar']
obj3 = 'bar'
for i in [obj1,obj2,obj3]:
checktype(i)
期望的输出:
It's a list of strings
It's not a list of strings or a single string
It's a single string
答案 0 :(得分:15)
要测试列表中的所有项目是否为字符串,请使用all
内置和生成器:
if all(isinstance(s, str) for s in lis):
但请注意,如果您的列表为空,则仍会返回True
,因为从技术上讲,这是一个0字符串的列表。但是,由于您要将[]
视为False
,因此您需要执行此操作:
if lis and all(isinstance(s, str) for s in lis):
所以,你的功能应该是这样的:
def checktype(obj):
# This if statement makes sure input is a list that is not empty
if obj and isinstance(obj, list):
return all(isinstance(s, str) for s in obj)
else:
return False
如果此函数的输入是非空的列表并且完全由字符串组成,则此函数将仅返回True
。其他任何内容(例如[]
,['a', 1]
,('a', 'b')
等)都会返回False
。
此外,以这种方式使用all
还有一个额外的好处,即它会停止检查它找到的返回False
的第一个项目(不是字符串)。这使您可以非常有效地使用非常大的列表。
答案 1 :(得分:15)
我认为这样的事情?你可以做一些检查,看它是不是一个字符串。
>>> def checktype(obj):
return bool(obj) and all(isinstance(elem, basestring) for elem in obj)
>>> obj1 = ['foo','bar','bar','black','sheet']
>>> obj2 = [1,2,3,4,5,'bar']
>>> obj3 = 'bar'
>>> for i in [obj1, obj2, obj3] :
print checktype(i)
True
False
True
为什么要检查basestring
而不是str
?
您应该检查basestring
而不是str
,因为它是str
和unicode
类型继承的公共类。仅检查str
会遗漏unicode
类型。
根据Steven Rumbalski's建议,如果您需要专门检查字符串列表,可以这样做。
>>> def is_list_of_strings(lst):
return bool(lst) and not isinstance(lst, basestring) and all(isinstance(elem, basestring) for elem in lst)
# You could break it down into `if-else` constructs to make it clearer to read.
>>> for i in [obj1, obj2, obj3] :
print is_list_of_strings(i)
True
False
False
编辑 - 根据abarnert's建议,您还可以检查list
而不是not isinstance(lst, basestring)
,代码会被重写为。
>>> def is_list_of_strings(lst):
return bool(lst) and isinstance(lst, list) and all(isinstance(elem, basestring) for elem in lst)
# You could break it down into `if-else` constructs to make it clearer to read.
>>> for i in [obj1, obj2, obj3] :
print is_list_of_strings(i)
True
False
False
离开一个衬垫,我们可以使用。
>>> def is_list_of_strings(lst):
if lst and isinstance(lst, list):
return all(isinstance(elem, basestring) for elem in lst)
else:
return False
答案 2 :(得分:1)
到目前为止我读过的答案在给出非字符串的非列表时会引发exepctions ...并且也不能迭代。这个问题在:
中得到解决In Python, how do I determine if an object is iterable?
采取鸭子打字的方法:
def categorize(x):
result = "not a string or list of strings"
if isinstance(x, basestring):
return "It's a single string"
try:
if all(isinstance(y, basestring) for y in x):
return "It's a list of strings"
except TypeError:
pass
return "It's not a list of strings or a single string"
data = [ 5, "xyzzy", list("xyzzy"), ['1', '23', 456]]
for x in data:
print x, categorize(x)
输出:
5 It's not a list of strings or a single string
xyzzy It's a single string
['x', 'y', 'z', 'z', 'y'] It's a list of strings
['1', '23', 456] It's not a list of strings or a single string
答案 3 :(得分:0)
此答案适用于Python3。例如,变量名称为pins
:
if not (pins and isinstance(pins, list) and all(isinstance(pin, str) for pin in pins)):
raise TypeError('pins must be a list of one or more strings.')
它检查三件事:
如果您还需要检查字符串的唯一性,请包括以下第四项检查:
and (len(tokens) == len(set(tokens)))
答案 4 :(得分:0)
您也可以将所有元素转换为 str:
list(map(str, [1,2,3]))
结果:
['1', '2', '3']