的Python:检查如果对象是一个字符串列表

问题描述 投票:13回答:4

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

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
python types isinstance
4个回答
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因为它是从两个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

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
投票

我读过的答案给出一个非列表不是一个字符串时为止提高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

0
投票

这个答案就是Python 3。举例来说,如果变量名是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.')

它检查三件事情:

  1. 是不是空的?
  2. 它是一个列表?
  3. 是否包含字符串?

如果你还需要检查弦的独特性,包括第四检查:

and (len(tokens) == len(set(tokens)))
© www.soinside.com 2019 - 2024. All rights reserved.