如何检查列表列表中的所有元素是不是都是字符串
Posted
技术标签:
【中文标题】如何检查列表列表中的所有元素是不是都是字符串【英文标题】: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:我经常这样想,然后找到了一个更有效的解决方案。 :)
【参考方案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')
【讨论】:
以上是关于如何检查列表列表中的所有元素是不是都是字符串的主要内容,如果未能解决你的问题,请参考以下文章