我有如下数据:
data = [
{'item': "A", 'price': 100},
{'item': "B", 'price': 200},
{'item': "C", 'price': 300},
{'item': "D", 'price': 800}
]
有没有办法返回最贵的n
个最贵商品的名称?
答案 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])