2012-03-18 12 views
5

Chciałbym utworzyć listę maxValues ​​ zawierającą górne 20 wartości z listy liczb całkowitych lst.Filtruj maksymalnie 20 wartości z listy liczb całkowitych

maxValues = [] 
for i in range(20): 
    maxValues.append(max(lst)) 
    lst.remove(max(lst)) 

Czy istnieje bardziej kompaktowy kod do realizacji tego zadania, a nawet funkcja wbudowana?

+2

To nie tylko zwartość. Twój kod (jeśli jest poprawiony, instrukcja "del" jest błędna) to O (n * k), podczas gdy inne metody to O (nlogn). – agf

+0

@agf, Dziękuję, poprawione. – xralf

Odpowiedz

12

Jest heapq.nlargest():

maxvalues = heapq.nlargest(20, lst) 

Z Doc:

heapq.nlargest(n, iterable, key=None)

zwróci lista z n największymi elementami z th e zestaw danych zdefiniowany przez iterable. key, jeśli jest zapewnione, określa funkcję jednego argumentu, który jest używany, aby wyodrębnić klucza porównania z każdego elementu w iterable: key=str.lower Odpowiednik: sorted(iterable, key=key, reverse=True)[:n]

Albo w ten sam sposób wykorzystywać heapq.nsmallest() jeśli chcesz najmniejszy.

UWAGAfrom the doc:

Te dwie funkcje [nlargest i nsmallest] optymalnie dostosowane do mniejszych wartości n. W przypadku większych wartości bardziej efektywne jest użycie funkcji sorted(). Ponadto, gdy n==1, bardziej efektywne jest korzystanie z wbudowanych funkcji min() i max().

+0

Dzięki. To jest lepsze niż moja odpowiedź. Prawdopodobnie jest szybszy, gdy lista jest bardzo długa, ponieważ nie ma potrzeby sortowania całej listy. –

+0

@ Remi: dodałem notatkę z dokumentu, która porównuje, gdy dwa rozwiązania. –

+0

Dzięki za kompletną odpowiedź. – xralf

5
sorted(lst)[-20:] 

to najkrótsza rzecz, jaką mogę wymyślić. Prawdopodobnie też jest szybszy.

(edycja: najpierw spróbować uznało min zamiast max)

+0

Zaakceptowałem drugą odpowiedź, ponieważ jest bardziej kompletna, ale użyłem twojego prostego szybkiego rozwiązania. – xralf

Powiązane problemy