在添加新元素时,保持列表列表在第二个元素上排序的好方法是什么?

2024-04-20 11:07:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,里面有我正在循环的值。该文件由两列组成,分别具有x和y值。我将x和y值添加到一个列表中

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

但是,我希望列表最大长度为15个列表,只保留line.split()[1]中的最高值。有两种方法

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。有什么更好的方法来保持列表的排序,以便只添加新元素来替换列表中最低的元素?你知道吗


Tags: 文件方法keyin列表forexamplecount
1条回答
网友
1楼 · 发布于 2024-04-20 11:07:19

您正在寻找^{} module;堆可以让您高效地保存前N项。甚至有一个专门的函数用于您的具体用例:

from heapq import nlargest
from operator import itemgetter

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

这将传入生成器表达式,有效地处理循环。你知道吗

在引擎盖下,此方法:

  • 获取前15个元素并从中创建一个堆。你知道吗
  • 为以下所有项调用堆上的^{};这会将项添加到堆中,然后删除最小的项。因此,堆只包含15个最大的项。你知道吗
  • 完成iterable后,堆列表将被排序。你知道吗

相关问题 更多 >