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

alv*_*vas 13 python types isinstance

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

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)
Run Code Online (Sandbox Code Playgroud)

期望的输出:

It's a list of strings
It's not a list of strings or a single string
It's a single string
Run Code Online (Sandbox Code Playgroud)

iCo*_*dez 15

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

if all(isinstance(s, str) for s in lis):
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的列表为空,这仍将返回,True因为从技术上讲,这是一个0字符串的列表.不过,既然你要考虑[]的存在False,你将需要这样做:

if lis and all(isinstance(s, str) for s in lis):
Run Code Online (Sandbox Code Playgroud)

所以,你的功能应该是这样的:

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
Run Code Online (Sandbox Code Playgroud)

只有True当它的输入是一个非空的列表并且完全由字符串组成时,该函数才会返回.别的(如[],['a', 1],('a', 'b'),等)将使它返回False.

此外,all以这种方式使用还有一个额外的好处,即它停止检查它找到的第一个返回的项目False(不是字符串).这使您可以非常有效地使用非常大的列表.

  • 很好的答案,但将实例检查从`str`更改为`basestr`. (3认同)
  • ...当然,除非OP真正意味着"``列出``str`"而不是"`list` of strings"......这是可能的,但他并没有说这就是他想要的.(@StevenRumbalski在他的回答中解释得非常好,所以我不认为有必要在这里再解释一下.) (2认同)

Suk*_*lra 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
Run Code Online (Sandbox Code Playgroud)

为什么要检查basestring而不是str

您应该检查basestring,而不是str因为它是一个通用类从其中两个strunicode类型的继承.只检查str叶子的unicode类型.

根据Steven Rumbalski的建议,如果你需要专门检查字符串列表,你可以这样做.

>>> 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
Run Code Online (Sandbox Code Playgroud)

编辑 - 根据abarnert的建议,你也可以检查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
Run Code Online (Sandbox Code Playgroud)

远离一个衬垫,我们可以使用.

>>> def is_list_of_strings(lst):
        if lst and isinstance(lst, list):
            return all(isinstance(elem, basestring) for elem in lst)
        else:
            return False
Run Code Online (Sandbox Code Playgroud)

  • 规范说要测试字符串的*list*,所以`checktype('bar')`应该返回'False`.使用`basestring`做得很好. (3认同)
  • 实际上,我认为最好检查`isinstance(lst,list)`而不是'is isinstance(lst,basestring)`.毕竟,将字符串映射到字符串的字典不是字符串列表,而是字符串...但是,否则,很好的答案. (3认同)
  • 我很惊讶你没注意到@ abarnert建议的简单版本:`返回isinstance(lst,list)和所有(isstance(elem,basestring)for elem in lst)` (2认同)
  • 我喜欢你把它分开了.我觉得它更具可读性.给每个人自己.无论哪种方式,修改您的原始答案都是可以接受的.这可能比编辑到最后更清楚. (2认同)
  • 从Python 3开始,您只需检查isinstance(lst,str) (2认同)