如何比较列表列表中的元素?

How to compare elements in list-of-lists?

我有一个包含元素列表的列表(每个内部列表中的元素数量不同),我想将同一索引中的所有元素分组到单独的组中,并且 return 中的最大值每组: 例如,

elements = [[89, 213, 317], [106, 191, 314], [87]]

我想像这样对这些元素进行分组,

groups = [[89,106,87],[213,191],[317,314]]

预期结果是组中每个列表的最大值:106、213 和 317

我尝试使用以下代码对元素进行分组:

w = zip(*elements)
result_list = list(w)
print(result_list)

我得到的输出是

[(89, 106, 87)]

尝试创建一个以每个子列表的索引为键的字典,然后将 values 转换为新列表,然后映射到最大值:

from collections import defaultdict

elements = [[89, 213, 317], [106, 191, 314], [87]]

i_d = defaultdict(list)

for sub in elements:
    for i, v in enumerate(sub):
        i_d[i].append(v)

maxes = list(map(max, i_d.values()))
print(maxes)

i_d:

defaultdict(<class 'list'>, {0: [89, 106, 87], 1: [213, 191], 2: [317, 314]})

maxes:

[106, 213, 317]

您可以将 itertools.zip_longestfillvalue=float("-inf") 一起使用:

from itertools import zip_longest

elements = [[89, 213, 317], [106, 191, 314], [87]]

out = [max(t) for t in zip_longest(*elements, fillvalue=float("-inf"))]
print(out)

打印:

[106, 213, 317]

注意:zip() 在这里不起作用,因为(如您所述)每个内部列表中的元素数量不相同。使用 zip_longest() 时,缺失的元素将替换为 fillvalue,在本例中为 -infinity(并且 -infinity 将始终是 max() 函数中的最低值)