我有一个列表,可能包含也可能不包含子列表作为元素,我需要检查元素是否是子列表。
例如考虑
>>> list = ['a', 'b', 'c', ['d', 'e'] ]
正如我所料,我得到了
>>> list[2]
'c'
>>> list[3]
['d', 'e']
>>> list[3][1]
'e'
和
>>> len(list[1])
1
>>> len(list[3])
2
以及
>>> type(list[1])
<type 'str'>
>>> type(list[3])
<type 'list'>
到目前为止一切顺利。然而,非常令人惊讶(至少对于像我这样的python新手)
>>> type(list[1]) is list
False
>>> type(list[3]) is list
False
有人可以解释一下吗?显然,我可以使用len()
来确定元素是否是子列表,但我认为显式类型检查应该更合适,因为它更准确地说明了我想要做什么。谢谢。
答案 0 :(得分:3)
您使用了名称list
并且遮蔽了内置的。
因此,您正在测试列表中的一个元素的类型是否与列表本身相同。
将列表重命名为不使用相同的名称:
>>> lst = ['a', 'b', 'c', ['d', 'e'] ]
>>> type(lst[3])
<type 'list'>
>>> type(lst[3]) is list
True
一般来说,您希望使用isinstance()
function来测试某些内容是否为列表:
>>> isinstance(lst[3], list)
True
答案 1 :(得分:0)
只需检查元素是否为列表:
def is_inside(my_list, elem):
if isinstance(my_list, list):
return any([is_inside(child, elem) for child in my_list])
else:
return my_list == elem
In: is_inside(['a', 'b', 'c', ['d', 'e']], 'e')
Out: True
In: is_inside(['a', 'b', 'c', ['d', 'e']], 'f')
Out: False