Python中嵌套的不规则列表(不同的子列表长度和对象类型)中整数的最大值

2024-07-08 08:50:31 发布

您现在位置:Python中文网/ 问答频道 /正文

请考虑以下列表:

    assigned = [['A',[4, 5, 6]],['B',[7, 8, 9]],['D',[2,3]],['C',[14]]]

我希望重试子列表中整数的最大值。 在本案中为14

我的第一步是整理清单:

    def flattenToMax(x):

        if isinstance(x,list):
            return [a for i in x for a in flattenToMax(i)]
        else:
            return [x]

结果是:

    ['A', 4, 5, 6, 'B', 7, 8, 9, 'D', 2, 3, 'C', 14]

然后我做了:

    maxNum = (max([x for x in toMax if isinstance(x,int)]))

输出是我的预期结果14。 我问,如何将这两个步骤组合成一个函数


Tags: in列表forreturnifdef整数else
3条回答

您可以使用^{}来简化和组合步骤。此外,由于整数列表似乎总是每个子列表中的第二项,因此也可以避免类型检查

from itertools import chain

assigned = [['A',[4, 5, 6]],['B',[7, 8, 9]],['D',[2,3]],['C',[14]]]

m = max(chain.from_iterable(a[1] for a in assigned))
print(m)
# 14

有多种方法可以做到这一点。从我得到的情况来看,您的问题是不能将此部分添加到函数中,因为它是一个递归函数:

maxNum = (max([x for x in toMax if isinstance(x,int)]))

下面是一个如何在递归函数中拟合max部分的示例(提示:不使用实际的max()函数,而是通过递归计算max)

assigned = [['A',[4, 5, 6]],['B',[7, 8, 9]],['D',[2,3]],['C',[14]]]

def recursive_max(a, best=None):
    if isinstance(a, list):
        for i in a:
            best = recursive_max(i, best)
        return best
    else:
        return best if not isinstance(a, int) else (a if best is None or a > best else best)

print(recursive_max(assigned))

14

这是受Flattening a multilevel list of lists to a single level启发而来的,应该适用于任意数量的嵌套级别和大多数iterable类型

from collections.abc import Iterable

def flatten(lst):
    for el in lst:
      # Strings a considered values not iterables here
      if isinstance(el, Iterable) and not isinstance(el, str):
        # Go deep
        yield from flatten(el)
      else:
        # Non iterable, non int values are discarded
        if not isinstance(el, int):
          continue
        # Int value to consider for max lookup
        yield el

l = [
  ['A', [4, 5, 6]],
  ['B', {7, 8, 90}],
  ['C', (2, 3)],
  ['D', {14: True}],
  ['E',
    [10, [0, 1, 100]],
  ]
]

m = max(flatten(l))

print(m)

运行示例:https://repl.it/@GuillaumeDeslandes/multi-level-flatten

相关问题 更多 >

    热门问题