字典列表中的前n个键?

时间:2019-07-16 21:18:40

标签: python python-3.x

我有如下数据:

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

有没有办法返回最贵的n个最贵商品的名称?

3 个答案:

答案 0 :(得分:1)

您可以使用operator.itemgetter作为key对列表进行排序,以便按价格对对象进行排序,然后选择顶部的n

from operator import itemgetter
sorted(data, key=itemgetter('price'), reverse=True)[:n]

答案 1 :(得分:1)

作为一种更具算法性的方法,您可以使用大小为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, "A")元组以在最大堆中赋予优先级并维护价格和项目之间的映射。 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])

需要额外的result数组是:1)如果您需要按升序排列的商品,以及2)堆具有元组耦合(价格,商品),而您只需要商品。从理论上讲,如果您不关心格式化而只想要答案,则可以只返回堆。

答案 2 :(得分:0)

这是一个简单的实现,将仅打印数据的前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])