Python:检查对象是否是字符串列表

2024-04-28 17:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

如何检查对象是否为字符串列表?我只能检查对象是否为字符串:

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

Tags: of对象字符串obj列表stringbarit
3条回答

到目前为止,我读到的答案在给出一个非字符串的非列表时会引起注释……而且也是不可编辑的。这个问题在:

In Python, how do I determine if an object is iterable?

采用duck输入法:

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

要测试列表中的所有项是否都是字符串,请使用内置的^{}和生成器:

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(不是字符串)的项。这使您能够非常高效地处理非常大的列表。

我想是这样吧?你可以检查一下是不是一根线。

>>> 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,因为它是一个公共类,strunicode类型都从中继承。只检查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

相关问题 更多 >