How to check whether all elements in a list of lists are strings
假设我有这样的字符串列表:
1 | l=[['a','kl_hg', 'FOO'],['b', 'kl_c', 'po']] |
现在我想使用一个
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') |