【问题标题】:Finding max value of sublists in a list in Python在 Python 列表中查找子列表的最大值
【发布时间】:2023-01-02 18:31:26
【问题描述】:

我有一个包含许多子列表的列表C11。我想找到每个子列表的最大元素。我介绍了当前和预期的输出。

C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]

for i in range(0,len(C11)):
    C2=max(C11[i])
print(C2)

当前输出是

[[353.856161, 0.0, 0.0], [0.0, 294.983702, 126.991664]]

预期的输出是

[[[353.856161],[282.754301]], [[294.983702]]]

【问题讨论】:

  • 列表维度的深度是否像示例中那样是随机的?如果是这样,您将需要一个比上述更通用的解决方案
  • 是的,列表深度将是随机的,如上所示。有一个更通用的代码会很棒。
  • @AEinstein 那么你怎么接受了只依赖于两个嵌套级别的答案?

标签: python list


【解决方案1】:

如果深度完全是任意的,并且您想在输出中保持相同的嵌套结构,这里有一个递归函数,它一直按级别进行直到到达“叶子”(包含值的列表而不是列表)并采用max免疫球蛋白:

def get_max(l):
    res = []
    if isinstance(l[0], list):
        for sub in l:
            res.append(get_max(sub))
    else:
        res.append(max(l))
    return res

print(get_max([[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]))

会给:

[[[353.856161], [282.754301]], [[294.983702]]]

【讨论】:

    【解决方案2】:

    列表理解

    代码:-

    C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
    
    res=[[[max(sublist)] for sublist in lis] for lis in C11]
    
    print(res)
    

    输出:

    [[[353.856161], [282.754301]], [[294.983702]]]
    

    【讨论】:

    • 这假设只有两层嵌套......
    【解决方案3】:

    如果列表的嵌套深度可变,请使用此函数。

    C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
    
    
    def find_max(ls: list) -> list:
        # does the list contain only numbers?
        if all((isinstance(x, float) for x in ls)):
            # if  yes return simple max
            return [max(ls)]
        else:
            # apply the function one level deeper
            return [find_max(x) for x in ls]
    
    print(find_max(C11))
    

    【讨论】:

      【解决方案4】:

      这是一种快速递归的通用方法。应该适用于任何级别的不同嵌套。

      c11 = [[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
      
      result = []
      
      def traverse(arr, result):
          if len(arr) > 0:
              if type(arr[0]) is list:
                  # check if item inside list is another list
                  for i in arr:
                      result = traverse(i, result)
              else:
                  # if its a list of number, get the max and add it to result
                  result.append(max(arr))
          return result
      
      print(traverse(c11, result))
      

      【讨论】:

        【解决方案5】:

        使用递归是最好的选择。递归适用于任何长度的列表。使用初始验证来检查列表元素是否为空。

        代码:

        check=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
        
        def recursive_max(lst):
            if len(lst) == 0:
                return []
            if isinstance(lst[0], list):
                min_val = []
                for val in lst:
                    min_val.append(recursive_max(val))
                return min_val
            else:
                return [max(lst)]
        
        print(recursive_max(check))
        

        输出:

        [[[353.856161], [282.754301]], [[294.983702]]]
        

        【讨论】:

          【解决方案6】:

          C11数组是多维数组需要放入嵌套循环

          C11 = [[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
          for i in range(0, len(C11)):
              for j in range(0, len(C11[i])):
                  C2 = max(C11[i][j])
                  print(C2)
          

          输出

          【讨论】:

            【解决方案7】:

            我假设列表的深度是随机的。

            我使用递归方法将最后一级列表替换为其最大值列表。

            def recurse(l):
                for index in range(len(l)):
                    if type(l[index]) == list:
                        l[index] = recurse(l[index])
                    else:
                        l = [max(l)]
                        return l
                return l
            

            例子:

            l = [[5,3,8], [1,2,4], [[[2,4],[11,12]],[5,9]]]
            recurse(l)
            print(l)
            

            输出:

            [[8], [4], [[[4], [12]], [9]]]
            

            你的例子:

            C11=[[[353.856161, 0.0, 0.0], [0.0, 0.0, 282.754301, 0.0]], [[0.0, 294.983702, 126.991664]]]
            recurse(C11)
            print(C11)
            

            输出:

            [[[353.856161], [282.754301]], [[294.983702]]]
            

            注意:该函数就地更新列表,因此如果您想恢复列表,请使用旧列表的副本。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-16
              • 1970-01-01
              • 2015-02-24
              • 1970-01-01
              • 2021-02-24
              • 1970-01-01
              相关资源
              最近更新 更多