如何从嵌套列表中找到第 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 =2 答案应该是 [4,5,6,7]
处理
如果 K = 1 答案应该是 [6, 7, 8, 9, 10, 11] 因为后面会出现
处理中
我最初按长度对嵌套子列表进行排序,我认为这对于找到第 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]
我有一个这样的列表
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 =2 答案应该是 [4,5,6,7] 处理
如果 K = 1 答案应该是 [6, 7, 8, 9, 10, 11] 因为后面会出现 处理中
我最初按长度对嵌套子列表进行排序,我认为这对于找到第 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]