【问题标题】:How can I count the depth in a list of lists?如何计算列表列表中的深度?
【发布时间】:2021-08-20 15:16:51
【问题描述】:

我想计算一个列表的深度,所以不是元素的数量,而是一个列表可以具有的最大深度。

这是我的功能:

def max_level(lst):

print(max_level([1, [[[2, 3]]], [[3]]])))

应该返回 4

【问题讨论】:

    标签: python list depth


    【解决方案1】:

    你可以试试:

    def max_level(lst):
        return isinstance(lst, list) and max(map(max_level, lst)) + 1
    
    print(max_level([1, [[[2, 3]]], [[3]]]))
    

    输出:

    4
    

    解释:

    1. 首先检查传入递归函数的对象是否为list类型:
    def max_level(lst):
        return isinstance(lst, list)
    
    1. 如果是这样,继续在列表中添加Trues:
    and max(map(max_level, lst)) + 1
    

    其中max(map(max_level, lst))返回Trues的当前数量,+ 1是再增加一个。


    如果可以有空列表,您可以将lst 替换为lst or [0],其中or 将告诉python 如果它不为空,则使用它左侧的列表,否则使用[0]

    def max_level(lst):
        return isinstance(lst, list) and max(map(max_level, lst or [0])) + 1
    
    print(max_level([1, [], [[]]]))
    

    输出:

    3
    

    针对@cdlane 的评论,如果您不想将布尔值与整数值混合,您可以在isinstance() 调用中添加int() 包装器:

    def max_level(lst):
        return int(isinstance(lst, list)) and max(map(max_level, lst or [0])) + 1
    

    【讨论】:

      【解决方案2】:

      我也想搜索一个空列表

      试试这个:

      def max_level(thing):
          return 1 + (max(map(max_level, thing)) if thing else 0) if isinstance(thing, list) else 0
      

      我重新设计了@AnnZen 的初始解决方案,添加了对空列表的额外检查,并且不混合布尔值和整数。

      【讨论】:

      • 有趣。虽然我的第二个解决方案检查空列表,并在 return 语句中添加 int() 包装器将消除混合布尔值和整数 :)
      • 您的第二个解决方案不检查空列表,它强制列表不为空。一种有效的方法,但您需要正确描述它。您的解决方案有时会返回一个整数,有时会返回一个布尔值。我不会从学生或专业程序员那里接受这一点。您的代码对布尔值进行算术运算。在 Python 中不是非法的,但不是很便携。我们应该教这个初学者program还是hack?添加布尔值有一个地方(例如“代码高尔夫”),但这看起来不像。
      猜你喜欢
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2015-02-04
      相关资源
      最近更新 更多