如何从嵌套列表中找到第 k 个最大的子列表(按长度)

How to find kth largest sublist(by length) from a nested list

我有一个这样的列表

list = [[1, 2, 3, 4], [1, 9, 12], [9], [8], [7, 8, 9, 10, 12, 16], [7, 8, 9, 10], [4, 5, 6, 7], [6, 7, 8, 9, 10, 11]]

我需要从上面的嵌套列表中找到列表长度最大的 k-th 子列表,这里有一个小问题:

我最初按长度对嵌套子列表进行排序,我认为这对于找到第 k 个最大子列表很有用,因为它还保留了较早处理它们的列表的顺序

sorted_list = [[9], [8], [1, 9, 12], [1, 2, 3, 4], [7, 8, 9, 10], [4, 5, 6, 7], [7, 8, 9, 10, 12, 16], [6, 7, 8, 9, 10, 11]]

无法确定从此处找到第 k 个最大元素的正确方法,

在最后两个子列表长度相同的大多数情况下,返回 sorted_list[-K] 将不起作用。

不要将列表元素与排序混淆,排序是根据子列表的长度进行的,顺序保留在 sorted_list

您可以使用字典按长度查找唯一元素,然后对值进行排序以找到对应的第 k 个元素:

lst = [[1, 2, 3, 4], [1, 9, 12], [9], [8], [7, 8, 9, 10, 12, 16], [7, 8, 9, 10], [4, 5, 6, 7], [6, 7, 8, 9, 10, 11]]

# the dictionary will store the last appearing element of the corresponding key (the later one in the processing)
lookup = {len(e): e for e in lst}

# sort the values of the lookup dictionary, reverse by len
res = sorted(lookup.values(), key=len, reverse=True)

k = 2
print(res[k - 1])

k = 1
print(res[k - 1])

输出

[4, 5, 6, 7]
[6, 7, 8, 9, 10, 11]

您可以将 Python 的 itertools.groupby 应用于您的排序列表:然后访问分组列表的索引 -k 会为您提供第 k 个最大长度的所有列表,其中你想要最后一个:

import itertools

nums = [[1, 2, 3, 4], [1, 9, 12], [9], [8], [7, 8, 9, 10, 12, 16], [7, 8, 9, 10], [4, 5, 6, 7], [6, 7, 8, 9, 10, 11]]
sorted_list = sorted(nums, key=len)

grouped_list = [list(g) for k, g in itertools.groupby(sorted_list, len)]

def kth_largest(k: int):
    return grouped_list[-k][-1]

print(kth_largest(k=2))
print(kth_largest(k=1))

给出:

[4, 5, 6, 7]
[6, 7, 8, 9, 10, 11]