Фильтровать не более 20 значений из списка целых чисел - PullRequest
5 голосов
/ 18 марта 2012

Я хотел бы создать список maxValues ​​, содержащий 20 лучших значений из списка целых чисел lst .

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

Есть ли более компактный коддля достижения этой задачи или даже встроенной функции?

Ответы [ 2 ]

12 голосов
/ 18 марта 2012

Там heapq.nlargest():

maxvalues = heapq.nlargest(20, lst)

Из документа:

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

Возвращает список с n самыми большими элементами из набора данных, определенного как iterable. key, если предоставлено, определяет функцию с одним аргументом, которая используется для извлечения ключа сравнения из каждого элемента в итерируемой: key=str.lower Эквивалентно: sorted(iterable, key=key, reverse=True)[:n]

Или таким же образом используйте heapq.nsmallest(), если вы хотите наименьшее.

ВАЖНОЕ ПРИМЕЧАНИЕ из документа :

Последние две функции [nlargest и nsmallest] работают лучше при меньших значениях n. Для больших значений более эффективно использовать функцию sorted(). Кроме того, когда n==1, более эффективно использовать встроенные функции min() и max().

6 голосов
/ 18 марта 2012
sorted(lst)[-20:]

- самое короткое, о чем я могу думать.Скорее всего, и быстрее.

(отредактировано: сначала попробуйте найти мин вместо максимума)

...