1 Извлечение N самых больших или N самых маленьких элементов из итерируемого

Для того, чтобы найти некоторое количество (более одного) из больших или мельчайших значений итератора, вы можете использовать nlargest и nsmallest из heapq модуля:

 import heapq

# get 5 largest items from the range

heapq.nlargest(5, range(10))
# Output: [9, 8, 7, 6, 5]

heapq.nsmallest(5, range(10))
# Output: [0, 1, 2, 3, 4]

 

Это гораздо эффективнее, чем сортировка всего итерируемого и затем нарезка с конца или начала. Внутри эти функции используют бинарные кучи приоритетной очереди структуру данных, которая является очень эффективной для этого случая использования.

Как min , max и sorted , эти функции принимают дополнительный key ключевого слова аргумента, который должен быть функцией , которая, учитывая элемент, возвращает ключ сортировки.

Вот программа, которая извлекает 1000 самых длинных строк из файла:

 import heapq
with open(filename) as f:
    longest_lines = heapq.nlargest(1000, f, key=len)

 

Здесь мы открываем файл и передать дескриптор файла f в nlargest . Повторение файла дает каждую строку файла как отдельную строку; nlargest затем проходит каждый элемент (или линия) передается функции len , чтобы определить его ключ сортировки. len , учитывая строку, возвращает длину строки в символах.

Это требует только хранилища для списка из 1000 самых больших строк, которые можно сравнить с

 longest_lines = sorted(f, key=len)[1000:]

 

которые должны будут держать весь файл в памяти.