如何检查一个列表中的所有元素是否都是字符串,该列表包含多个子列表?

3
假设我有一个像这样的字符串列表列表:

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

现在我想使用一个伪代码中的if命令,如下所示:
if allElementsOf(l).isString():
#do something

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

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

这是正确的操作方法吗?如果需要处理大量数据,是否有更快捷的解决方案?


4
你怎么可能打败 O(m*n) 呢?你需要检查列表中每个列表中的每个元素!all 已经提供了一种简便方法(即它找到的第一个不是字符串的元素将结束循环)。 - jonrsharpe
对于大型列表,chain.from_iterable(l) 可能会更快一些,但复杂度不会改变。 - Padraic Cunningham
@PadraicCunningham:感谢您的建议。我猜您所想的解决方案看起来像danihp发布的那个? - Cleb
@jonrsharpe:我经常这样想,然后找到了一个更高效的解决方案。 :) - Cleb
@danihp,不用担心。 - Padraic Cunningham
显示剩余4条评论
4个回答

3

你的方法是正确的,任何展平列表的快捷方式似乎都很慢。最快的方法可能是使用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) ):
    ...

1
很好,这个方法运行良好,似乎比我的方法更快。我点赞并可能稍后接受它(以防出现更好的方法)。谢谢! - Cleb

3

有趣的是,似乎没有人告诉过你关于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()函数的优点在于它不会评估整个序列,而是在找到第一个True值时返回 - 与all()相反。

同样好用!感谢提供替代方案,我也给你的答案点赞。 - Cleb

1

您可能希望在任何嵌套层次下都能解决此问题,因此可以使用递归来解决。例如:

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

不记得为什么没有点赞这个问题;只是回到了这个旧问题,发现你的解决方案完美地解决了它。现在已经点赞了。 - Cleb

0

你可以使用这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接