如何检查列表中的所有元素是否都是字符串

2024-06-08 14:55:27 发布

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

假设我有一个字符串列表,如下所示:

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

现在我想使用if命令,如下所示(在伪代码中!)公司名称:

^{pr2}$

我从this question学习了如何检查单个变量是否为字符串。因此,对于一个单子,我可以:

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

对于我的实际列表l我可以做:

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

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


Tags: 字符串in列表foriffooallhg
3条回答

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

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

你的方法是正确的,any flatting list short cut seems slowest。一个fastest way may be use itertools

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

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

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()。在

相关问题 更多 >