2017-09-20 1 views
2

J'ai une liste de listes, où chaque sous-liste est une liste d'objets. La tâche consiste à renvoyer une liste des sous-listes supérieures n dans l'ordre décroissant de leur longueur.Python: Retourne les n premières listes de la sous-liste ayant la longueur maximale

Illustration:

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

Pour ci-dessus, je veux retourner une liste des 3 sous-listes selon la longueur, ce qui est

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

que les sous-listes ont la plus grande longueur 3 , 2,1 respectivement de la liste.

Répondre

4

Vous avez deux options possibles, disons:

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

Vous pouvez produire une toute nouvelle liste et de prendre la 3 éléments:

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

Ou, vous pouvez trier votre liste initiale et les prennent les 3 premiers éléments:

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

En termes de performance, la deuxième option semble plus rapide:

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

ici la tâche est de retourner une liste (pas modifier de la question). Donc '' '' trié''' serait une suite de plus. – Siddharth

+0

@Siddharth, je suis d'accord, mais il semble qu'en termes de modification des performances, la liste semble plus rapide que de faire une copie de la nouvelle liste. – lmiguelvargasf

+0

@ lmiguelvargasf juste upvoted votre réponse pour le même – Siddharth

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

Vous pouvez toujours choisir de sélectionner haut k après épissage le résultat de sorted par sorted(a, key=len, reverse=True)[0:k].

L'observation principale à noter est l'argument key, qui peut également accepter n'importe quelle fonction folle lambda aussi.