【问题标题】:How to find kth largest sublist(by length) from a nested list如何从嵌套列表中找到第 k 个最大的子列表(按长度)
【发布时间】:2021-09-23 07:32:25
【问题描述】:

我有一个这样的列表

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-1-th?仍然不清楚为什么k=2 应该返回[4,5,6,7]。也许只是对 2 元素元组 - len 和原始索引进行排序。
  • stackoverflow.com/users/12062831/g%c3%b6khan-san stackoverflow.com/users/4046632/buran by最大子列表表示嵌套列表中列表的大小;类似于这里的最大数字列表的大小将决定列表。
  • 也不知道为什么 [4,5,6,7] 是那里的第二大列表。你能写出你的例子中正确的完全排序列表应该是什么吗?
  • 那么,将您的问题改写为“在所有不同长度的列表中,找到长度为第 k 大不同长度且在原始列表中出现在最后的列表是否公平?” /跨度>

标签: python python-3.x list nested-lists


【解决方案1】:

您可以通过将 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]

【讨论】:

    【解决方案2】:

    您可以使用字典按长度查找唯一元素,然后对值进行排序以找到对应的第 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2021-11-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多