【问题标题】:Python: Return top n lists from sublist having maximum lengthPython:从具有最大长度的子列表中返回前 n 个列表
【发布时间】:2017-09-20 19:40:47
【问题描述】:

我有一个列表列表,其中每个子列表都是一个对象列表。 任务是按长度降序返回前 n 个子列表的列表。

插图:

[[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]]

对于上面,我想返回一个按长度排列的前 3 个子列表的列表,即

[[{},{},{},{}],[{},{},{}],[{},{}]]

因为子列表的最大长度分别为列表中的 3,2,1。

【问题讨论】:

    标签: python python-3.x list list-comprehension


    【解决方案1】:

    你有两个可能的选择,比如说:

    l = [[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]]
    

    您可以生成一个全新的列表并获取所需的 3 个元素:

    sorted(l, key=len, reverse=True)[:3]
    

    或者,您可以对原始列表进行排序,然后它们会采用前 3 个元素:

    l.sort(key=len, reverse=True)
    l[:3]
    

    在性能方面,第二个选项似乎更快:

    In [1]: %timeit sorted(l, key=len, reverse=True)[:3]
    1.9 µs ± 28.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    In [2]: %%timeit
        ...: l.sort(key=len, reverse=True)
        ...: l[:3]
        ...: 
    1.22 µs ± 33.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    【讨论】:

    • 这里的任务是返回一个列表(不是从问题中修改)。所以sorted 会更适合。
    • @Siddharth,我同意,但就性能而言,修改列表似乎比复制新列表更快。
    • @lmiguelvargasf 刚刚对你的答案表示赞同
    【解决方案2】:
    >>> a = [[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]]
    >>> sorted(a, key=len, reverse=True)
    [[{}, {}, {}, {}], [{}, {}, {}], [{}, {}], [{}], []]
    

    sorted 的结果与sorted(a, key=len, reverse=True)[0:k] 拼接后,可以随时选择顶部k

    要注意的主要观察是参数key,它也可以接受任何疯狂的lambda函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多