gpt4 book ai didi

python - 序列中的 n 个最大元素(需要保留重复项)

转载 作者:太空狗 更新时间:2023-10-29 20:54:52 25 4
gpt4 key购买 nike

我需要在元组列表中找到 n 个最大的元素。这是前 3 个元素的示例。

# I have a list of tuples of the form (category-1, category-2, value)
# For each category-1, ***values are already sorted descending by default***
# The list can potentially be approximately a million elements long.
lot = [('a', 'x1', 10), ('a', 'x2', 9), ('a', 'x3', 9),
('a', 'x4', 8), ('a', 'x5', 8), ('a', 'x6', 7),
('b', 'x1', 10), ('b', 'x2', 9), ('b', 'x3', 8),
('b', 'x4', 7), ('b', 'x5', 6), ('b', 'x6', 5)]

# This is what I need.
# A list of tuple with top-3 largest values for each category-1
ans = [('a', 'x1', 10), ('a', 'x2', 9), ('a', 'x3', 9),
('a', 'x4', 8), ('a', 'x5', 8),
('b', 'x1', 10), ('b', 'x2', 9), ('b', 'x3', 8)]

我尝试使用 heapq.nlargest。但是它只返回前 3 个最大的元素并且不返回重复项。例如,

heapq.nlargest(3, [10, 10, 10, 9, 8, 8, 7, 6])
# returns
[10, 10, 10]
# I need
[10, 10, 10, 9, 8, 8]

我只能想到蛮力方法。这就是我所拥有的,并且有效。

res, prev_t, count = [lot[0]], lot[0], 1
for t in lot[1:]:
if t[0] == prev_t[0]:
count = count + 1 if t[2] != prev_t[2] else count
if count <= 3:
res.append(t)
else:
count = 1
res.append(t)
prev_t = t

print res

关于如何实现这个的任何其他想法?

编辑:timeit 100 万个元素列表的结果表明 mhyfritz's solution运行时间是蛮力的 1/3。不想让问题太长。所以在 my answer 中添加了更多详细信息.

最佳答案

我从您的代码片段中了解到,lot 是 w.r.t. 分组的。 类别 1。那么以下应该可以工作:

from itertools import groupby, islice
from operator import itemgetter

ans = []
for x, g1 in groupby(lot, itemgetter(0)):
for y, g2 in islice(groupby(g1, itemgetter(2)), 0, 3):
ans.extend(list(g2))

print ans
# [('a', 'x1', 10), ('a', 'x2', 9), ('a', 'x3', 9), ('a', 'x4', 8), ('a', 'x5', 8),
# ('b', 'x1', 10), ('b', 'x2', 9), ('b', 'x3', 8)]

关于python - 序列中的 n 个最大元素(需要保留重复项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6669632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com