0

ループしている値を含むファイルがあります。このファイルは、x 値と y 値を含む 2 つの列で構成されています。x と y の値をリストに追加しています。

example_list = []
for line in f:
    example_list.append([line.split()[0], line.split()[1]])

ただし、リストを最大 15 個のリストにして、最大値のみを保持したいと考えていますline.split()[1]。それを行う2つの方法は

example_list = []
for line in f:
    example_list.append([line.split()[0], line.split()[1]])
top_15 = example_list.sort(key=operator.itemgetter(1), reverse=True)[:15]

また

example_list = []
count = 0
for line in f:
    if count < 15:
        example_list.append([line.split()[0], line.split()[1]])
        count += 1
    else:
        example_list.sort(key=operator.itemgetter(1))
        if example_list[0][1] < line.split()[1]:
            example_list[0] = line.split()[1]

sortただし、メモリ内のファイル全体を読み取ったり、すべての行を呼び出したりしたくありません。リストの一番下の要素を置き換えるためにのみ新しい要素が追加されるように、リストのリストをソートしておくより良い方法は何ですか?

4

1 に答える 1

3

heapqモジュールを探しています。ヒープを使用すると、上位 N 個のアイテムを効率的に保持できます。正確なユースケース専用の関数もあります。

from heapq import nlargest
from operator import itemgetter

largest_15 = nlargest(15, (line.split()[:2] for line in f), itemgetter(1))

これにより、ジェネレーター式が渡され、ループが効率的に処理されます。

内部的には、このメソッドは次のとおりです。

  • 最初の 15 要素を取得し、そこからヒープを作成します。
  • heappushpop()次のすべての項目のヒープを呼び出します。これにより、アイテムがヒープに追加され、最小のアイテムが削除されます。その結果、ヒープには最大の 15 個のアイテムしか含まれません。
  • iterable が完了すると、ヒープ リストがソートされます。
于 2013-10-01T08:53:23.560 に答える