关于python:如何检查列表列表中的所有元素是否为字符串

How to check whether all elements in a list of lists are strings

假设我有这样的字符串列表:

1
l=[['a','kl_hg', 'FOO'],['b', 'kl_c', 'po']]

现在我想使用一个if命令,如下所示(伪代码!):

1
2
if allElementsOf(l).isString():
#do something

从这个问题中,我学习了如何检查单个变量是否是字符串。因此,对于单个列表,我可以做到:

1
2
3
dummyL = ['a','kl_hg', 'FOO']
if all(isinstance(s, basestring) for s in dummyL):
#do something

对于我的实际清单,我可以这样做:

1
2
if all(isinstance(el, basestring) for sl in l for el in sl):
#do something

是这样做的,还是有一个更快的解决方案,因为这需要一段时间来处理大量的列表?


奇怪的是,有人告诉任何()内置函数:

1
2
3
4
5
6
7
seq = [['a','kl_hg', 'FOO'], ['b', 'kl_c', 'po', 13]]

def all_string(_iterable):    
    return not any([not isinstance(n, basestring) for i in _iterable
                        for n in i])

all_string(seq) # returns False

使用any()函数的优点是它不计算整个序列,而是在找到第一个真值时返回,与all()相反。


你的方法是正确的,任何扁平化名单的捷径似乎最慢。最快的方法可能是使用itertools:

1
2
3
4
import itertools
l=[['a','kl_hg', 'FOO'],['b', 'kl_c', 'po']]
if all( isinstance(x, basestring) for x in  itertools.chain.from_iterable(l) ):
    ...


对于任何级别的嵌套,您可能希望在一般情况下使用递归来解决这个问题。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def all_strings(thing):
    if isinstance(thing, str):
        return True
    elif isinstance(thing, list):
        for subthing in thing:
            if not all_strings(subthing):
                return False
        return True
    else:
        return False

>>> print all_strings('foo')
True
>>> print all_strings(['foo'])
True
>>> print all_strings(['foo',['foo']])
True
>>> print all_strings(['foo',[1, 'foo']])
False
>>>


您可以使用:

1
2
3
4
for x in l:
    for a in range(3):
        if type((x[a])) == str:
            print(x[a], ' is a string')