验证输入是列表还是单个元素列表的列表

时间:2015-01-26 21:03:48

标签: python validation python-3.x

有没有快速的方法来验证列表是否采用这种格式:

[a,b,c,...]
or
[[a,b,c...],[x,e,w,...],...]

但不是

[[[a],[b],[c]...],[[x],[e],[w],...],...]

或任何类似的

[[a,b,[e],f...],[x,e,w,...],...]

基本上是单个元素的列表,或包含单个元素的列表列表,但不是列表列表或更多嵌套...

我尝试用以下内容检查第二种情况:

all(isinstance(elem, list) for elem in v)

但这不符合我的情况

1 个答案:

答案 0 :(得分:2)

not any()all()or

结合使用
flat = lambda l: not any(isinstance(e, list) for e in l)
if flat(v) or all(isinstance(e, list) and flat(e) for e in v):

如果v中的元素的 none 是列表或者所有都是平面列表,则此短路和整体都是正确的。

演示:

>>> def flat_or_singular(v):
...     flat = lambda l: not any(isinstance(e, list) for e in l)
...     return flat(v) or all(isinstance(e, list) and flat(e) for e in v)
... 
>>> tests = [
...     ['a', 'b', 'c'],
...     [['a' ,'b', 'c'], ['x', 'e', 'w']],
...     [[['a'], ['b'], ['c']], [['x'], ['e'], ['w']]],
...     [['a', 'b', ['e'], 'f'], ['x', 'e', 'w']],
... ]
>>> for test in tests:
...     print('{}: {}'.format(flat_or_singular(test), test))
... 
True: ['a', 'b', 'c']
True: [['a', 'b', 'c'], ['x', 'e', 'w']]
False: [[['a'], ['b'], ['c']], [['x'], ['e'], ['w']]]
False: [['a', 'b', ['e'], 'f'], ['x', 'e', 'w']]