【问题标题】:How to check if an element of a list is a list (in Python)?如何检查列表的元素是否是列表(在 Python 中)?
【发布时间】:2012-04-03 08:00:51
【问题描述】:

如果我们有以下列表:

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

如果我需要确定列表中的元素本身是否是一个列表,我可以将以下代码中的 aValidList 替换为什么?

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

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

【问题讨论】:

  • 你为什么需要它?您是否要扁平化您的列表?
  • 另外:(1) 不要使用list 作为变量名,因为它会影响内置的list()(2) 那些圆括号应该是什么意思?
  • @RikPoggi 这是我正在尝试的练习。最初我们被要求检查一个标准列表并返回以大写“U”开头的元素的数量。我想看看我是否可以扩展它来搜索列表和子列表并返回计数。因此,如果上述列表是输入,则该过程将返回计数为 4。 () 是错别字。 :-)

标签: python


【解决方案1】:

你可以简单地写:

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

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

【讨论】:

    【解决方案2】:

    可能更直观的方式是这样的

    if type(e) is list:
        print('Found a list element inside the list') 
    

    【讨论】:

      【解决方案3】:

      使用isinstance:

      if isinstance(e, list):
      

      如果要检查对象是列表还是元组,请将多个类传递给isinstance

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

      【讨论】:

        【解决方案4】:
        1. 找出您希望项目具有list 的哪些特定属性。它们需要可索引吗?可切片?他们需要.append() 方法吗?

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

        3. 使用isinstance:

          isinstance(x, collections.MutableSequence)
          

        您可能会问“为什么不直接使用type(x) == list?”你不应该那样做,因为那样你就不会支持看起来像列表的东西。而Python心态的一部分是duck typing

        我看到一只像鸭子一样走路,像鸭子一样游泳,像鸭子一样叫的鸟,我称那只鸟为鸭子

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

        【讨论】:

        • 抽象基类参考(collections.MutableSequencelist 是正确的,但这里是主要参考),对于正在阅读此答案并好奇的其他人:docs.python.org/library/…
        • @ninjagecko 是的,这就是#2 中的链接 =)
        • @Alex 您的建议在技术上是正确的,但它需要通常不需要的额外工作。为什么不直接使用isinstance(x, list)?这是直接的、标准的做法,并且被认为是良好的做法。另外,考虑接口和 ABC 可能会难倒初学者。如果持续使用太麻烦,“更好”的解决方案就不是最佳实践。
        • @alexis isinstance(x, list) 不被认为是好的做法,至少在我的书中没有!如果您确定自己永远不会看到任何自定义对象,那也没关系,但要做到isinstance(x, collections.MutableSequence) 有多难?
        • 好吧,你的作者可能最了解,所以我不会为我的观点辩护。但我一直在查看 [python FAQ][1],它只是建议将 isinstance 与一个类一起使用,或者最好完全避免它。
        【解决方案5】:

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

        ...
        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
        >>> 
        

        【讨论】:

        • 可能值得强调的是,问题中名为list 的变量将隐藏list 类型,这意味着此处发布的大多数其他答案如果简单地粘贴就会失败。(令人尴尬的是我经常被那个咬伤。)
        • +1 用于使用 any() 而不是一些 for-loop-if 组合。
        猜你喜欢
        • 1970-01-01
        • 2021-11-15
        • 2019-10-04
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 2021-12-17
        • 2013-03-21
        • 1970-01-01
        相关资源
        最近更新 更多