【问题标题】:How to check whether all elements in a list of lists are strings如何检查列表列表中的所有元素是否都是字符串
【发布时间】:2015-10-03 11:12:18
【问题描述】:

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

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

现在我想使用如下if 命令(在伪代码中!):

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

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

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

【问题讨论】:

  • 你怎么可能打败O(m*n)?您需要检查列表中每个列表中的每个元素! all 已经为您提供了捷径(即它发现 isn't 字符串的第一个元素将结束循环)。
  • 对于大型列表chain.from_iterable(l) 可能会快一点,但复杂性不会改变
  • @PadraicCunningham:感谢您的建议。我猜你想到的解决方案看起来像 danihp 发布的那个?!
  • 对不起@PadraicCunningham,我在发布答案后看到了你的评论!
  • @jonrsharpe:我经常这样想,然后找到了一个更有效的解决方案。 :)

标签: python string performance list


【解决方案1】:

你的方法是对的,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) ):
    ...

【讨论】:

  • 很好,效果很好,而且似乎比我的方法更快。我赞成它,以后可能会接受它(以防万一出现更好的东西)。谢谢!
【解决方案2】:

奇怪的是有人告诉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() 相比。

【讨论】:

  • 也很好用!感谢您提供替代解决方案,我也赞成您的回答。
【解决方案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
>>> 

【讨论】:

  • 不记得我为什么不赞成这个;刚刚回到这个老问题,你的解决方案工作得很好。现在投赞成票。
【解决方案4】:

你可以用这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 2019-12-22
    • 2018-06-24
    • 2021-12-27
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多