2017-09-20 57 views
2

我有一个列表列表,其中每个子列表都是对象列表。 这个任务是按照长度从大到小的顺序返回前n个子列表。Python:从最大长度的子列表中返回前n个列表

插图:

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

对于上面,我想回到前3子列表列表按长度,这是

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

为子列表有最大长度为3 ,2,1分别从名单中。

回答

4

你有两种可能的选择,让我们说:

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) 
+0

这里的任务是返回一个列表(不能修改问题)。所以'''分类''会套房更多。 – Siddharth

+0

@Siddharth,我同意,但从性能的角度来看,修改列表似乎比制作新列表的副本要快。 – lmiguelvargasf

+0

@ lmiguelvargasf只是upvoted你的答案相同 – Siddharth

2
>>> a = [[{},{},{},{}],[{},{},{}],[{},{}],[{}],[]] 
>>> sorted(a, key=len, reverse=True) 
[[{}, {}, {}, {}], [{}, {}, {}], [{}, {}], [{}], []] 

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

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