16

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

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
4

6 回答 6

21

像这样的东西,我猜?您可以进行一些检查以查看它是否是单个字符串。

>>> 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 的建议,如果您需要专门检查字符串列表,您可以这样做。

>>> 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 的建议,您还可以检查 alist而不是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
于 2013-08-28T18:05:30.340 回答
19

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

if all(isinstance(s, str) for s in lis):

但请注意,如果您的列表为空,它仍然会返回True,因为从技术上讲,它是一个 0 字符串的列表。但是,由于您想将其视为[]is 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(不是字符串)。这使您可以非常有效地处理非常大的列表。

于 2013-08-28T18:04:59.813 回答
2

此答案适用于 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(pins) == len(set(pins)))
于 2019-02-04T17:59:48.593 回答
1

到目前为止,当给定一个不是字符串的非列表时,我读过的答案会引发异常......而且也不是可迭代的。该问题在以下方面得到解决:

在 Python 中,如何确定对象是否可迭代?

采用鸭式方法:

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
于 2013-08-28T18:56:14.577 回答
1

作为一个班轮:

assert all(map(lambda x: isinstance(x, str), my_list))
于 2021-11-11T10:30:43.367 回答
0

您还可以将所有元素转换为 strlist(map(str, [1,2,3]))

结果: ['1', '2', '3']

于 2021-06-06T04:44:59.593 回答