Python 目录列表中的前n个键?

Python 目录列表中的前n个键?,python,python-3.x,Python,Python 3.x,我有如下数据: data = [ {'item': "A", 'price': 100}, {'item': "B", 'price': 200}, {'item': "C", 'price': 300}, {'item': "D", 'price': 800} ] 有没有办法返回前n个最昂贵项目的名称?您可以使用operator.itemgetter作为键对列表进行排序,以便按价格对对象进行排序,然后选择前n个项目 从运算符导入itemgetter sorteddata,key=ite

我有如下数据:

data = [
{'item': "A", 'price': 100}, 
{'item': "B", 'price': 200}, 
{'item': "C", 'price': 300}, 
{'item': "D", 'price': 800}
]

有没有办法返回前n个最昂贵项目的名称?

您可以使用operator.itemgetter作为键对列表进行排序,以便按价格对对象进行排序,然后选择前n个项目

从运算符导入itemgetter sorteddata,key=itemgetter'price',reverse=True[:n]
下面是一个简单的实现,它将只打印数据的前n个值:

data = [
    {'item': "A", 'price': 100},
    {'item': "B", 'price': 200},
    {'item': "C", 'price': 300},
    {'item': "D", 'price': 800}
]

n = 2
print(sorted(data, key=lambda x: x['price'], reverse=True)[:n])

作为一种更具算法性的方法,您可以使用大小为n的最小堆来跟踪前n个元素。您可以使用python的heapq库,该库非常简单:

import heapq

# pushing to the heap
heap = []
heapq.heappush(heap, (100, "A"))

# popping from the heap
price, item = heapq.heappop()
在100中,需要一个元组来指定最大堆中的优先级,并维护价格和项目之间的映射。100是优先级-在堆中排序时使用的键。A只是关联的项目,不用于任何计算,它只是使查找与价格关联的元素变得容易

此方法的基本算法如下所示:

import heapq
def find_top_k_elements(data, k):
    heap = []
    for row in data:
        if len(heap) < k:
            heapq.heappush(heap, (row["price"], row["item"]))
        else:
            # if the current price we are looking at is larger
            # than the smallest price in the heap
            if row["price"] > heap[0][0]:
                # add it to the heap
                heapq.heappush(heap, (row["price"], row["item"]))
                # we now have k + 1 elements in the heap
                # we need to pop the smallest element
                heapq.heappop()
    result = []
    while heap:
        # add the item name to result list
        result.append(heapq.heappop()[1])

如果您需要按价格升序排列的项目,则需要额外的结果数组1;如果堆具有元组耦合价格,则需要额外的结果数组2,因为您只需要该项目。从理论上讲,如果您不关心格式,只想得到答案,您可以返回堆

只需对它进行排序,然后取前n项:sorteddata,key=lambda x:x['price'],reverse=truen对数据使用该结构有什么特别的原因吗?似乎所有这些都可以在一个目录中,看起来像这样:{A:100,B:200,C:300,D:800}。或者它甚至可能是一个对象列表,其中包含名称和价格的实例变量。@MarkMeyer如果你用一些细节和/或代码注释来充实你的评论,那么它肯定是一个答案。几乎可以肯定它是一个骗局@mypetlion-只是现在没有时间搜索。这个网站通常不赞成只使用代码的答案。请编辑您的答案,包括您的代码的作用以及它如何解决OP的问题的解释。最好使用heapq.nlargest而不是排序和切片。