如何检查列表中的元素是否为列表(在Python中)?

74

如果我们有以下列表:

list = ['UMM', 'Uma', ['Ulaster','Ulter']]

如果我需要找出列表中的元素是否为列表本身,以下代码中的aValidList应替换为什么?

for e in list:
    if e == aValidList:
        return True

是否有特殊的导入需要使用?有没有最好的方法来检查一个变量/元素是否为列表?


1
可能是重复的问题:测试变量是否为列表或元组 - Matt Ball
1
你为什么需要那个?你是想把列表压平吗? - Rik Poggi
4
注意:(1)不要使用list作为变量名称,因为它会遮盖内置的list()函数。(2)这些圆括号应该表示什么意思? - Rik Poggi
@RikPoggi 这是我正在尝试的一项练习。最初,我们被要求遍历一个标准列表,并返回以大写字母“U”开头的元素计数。我想看看是否可以扩展它来搜索列表和子列表并返回计数。因此,如果上面的列表是输入,则该过程将返回四个计数。() 是打字错误。 :-) - rishimaharaj
5个回答

136

使用isinstance函数:

if isinstance(e, list):

如果你想检查一个对象是否是列表或元组,可以将多个类传递给 isinstance

if isinstance(e, (list, tuple)):

23
  1. 确定您想要的列表具有哪些特定属性。它们需要是可索引的吗?可以进行切片操作吗?它们需要一个.append()方法吗?

  2. 查找描述该特定类型的抽象基类,该基类在collections模块中。

  3. 使用isinstance

  4. isinstance(x, collections.MutableSequence)
    
    你可能会问:"为什么不只是使用type(x) == list?" 你不应该这样做,因为这样你就不能支持看起来像列表的东西。而Python思想的一部分是鸭子类型:

    我看到一只走路像鸭子,游泳像鸭子,叫声像鸭子的鸟,我就把那只鸟叫做鸭子。

    换句话说,你不应该要求对象是list,只需要它们具有你需要的方法即可。例如,collections模块提供了一堆抽象基类,这有点像Java接口。任何是collections.Sequence实例的类型都将支持索引。

抽象基类引用(collections.MutableSequence 对于 list 是正确的,但这里是主要参考),对于其他阅读此答案并感到好奇的人:http://docs.python.org/library/collections.html#collections-abstract-base-classes - ninjagecko
2
@ninjagecko,是的,那就是#2中的链接 =) - Katriel
1
@Alex你的建议在技术上是正确的,但它需要额外的工作,通常并不是必要的。为什么不直接使用isinstance(x, list)呢?这是简单明了、标准做法,并被认为是良好的实践。而且,考虑接口和抽象基类很有可能会让初学者程序员感到困惑。即使一个"更好"的解决方案存在,如果使用起来过于麻烦而无法保持一致性,那就不是最佳实践。 - alexis
@alexis 在我的观点里,isinstance(x, list)并不被认为是个好的编程实践!如果你确定永远不会遇到任何自定义对象,也许这样做没问题,但是使用isinstance(x, collections.MutableSequence)又有多难呢? - Katriel
你的作者可能最清楚,所以我不会为我的观点辩护。但是我刚刚在 Python FAQ 上查看了一下,它建议使用 isinstance 与类一起使用,或者最好完全避免使用它。 - alexis
忘记链接了:[1]: http://docs.python.org/faq/programming.html#how-do-i-check-if-an-object-is-an-instance-of-a-given-class-or-of-a-subclass-of-it - alexis

11

你正在寻找的表达式可能是:

...
return any( isinstance(e, list) for e in my_list )

测试:

>>> my_list = [1,2]
>>> any( isinstance(e, list) for e in my_list )
False
>>> my_list = [1,2, [3,4,5]]
>>> any( isinstance(e, list) for e in my_list )
True
>>> 

1
值得强调的是,问题中命名为“list”的变量将隐藏“list”类型,这意味着大多数其他答案在简单粘贴时都会失败。(令人尴尬的是,我经常被这个问题所困扰。) - Martin Stone
2
使用any()而不是一些循环和if语句的组合,可以使代码更简洁。 - Christoph

3
也许更直观的方式是这样的:
if type(e) is list:
    print('Found a list element inside the list') 

0

你可以简单地写:

for item,i in zip(your_list, range(len(your_list)):

    if type(item) == list:
        print(f"{item} at index {i} is a list")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接