获取元组列表中前五个最大的元素 - Python

4

我有一个元组列表,类似于这样(从sqlite3的select语句生成):

itemsAndQtyBought = [('Item no.1', 3), ('Item no.2', 0), ('Item no.3', 3), ('Item no.4', 2), ('Item no.5', 1), ('Item no.6', 9), ('Item no.7', 7)]

列表继续下去。它是一个元组列表,其中包含产品名称和购买该项目的数量。

我需要创建另一个元组列表,其中包含来自那个元组列表中购买数量最高的5个项目中的5个项目。

例如,对于上面的列表,结果将如下所示:

newItemsQtyBought = [('Item no.6', 9), ('Item no.7', 7), ('Item no.3', 3), ('Item no.1', 3), ('Item no.4', 2)]

有没有任何方法可以实现这个?

非常感谢任何答案。


1
为什么不直接使用select语句来创建您实际想要的项目列表呢? - ekhumoro
一个项目是否可能被列出多次?换句话说,[('apples', 3), ('apples', 2)] 是否应该加起来等于 ('apples', 5)?如果是这样的话,collections.Counter 正好可以满足你的需求。另外,你已经尝试过什么了吗? - Kevin J. Chase
4个回答

13

只需使用sorted并切片前5个项目:

In [170]: sorted(itemsAndQtyBought, key=lambda t: t[1], reverse=True)[:5]
Out[170]:
[('Item no.6', 9),
 ('Item no.7', 7),
 ('Item no.1', 3),
 ('Item no.3', 3),
 ('Item no.4', 2)]

7
您可以使用 heapq.nlargest() 函数:
from heapq import nlargest
from operator import itemgetter

nlargest(5, my_list, key=itemgetter(1))

heapq.nlargest(n, iterable[, key])

返回由iterable定义的数据集中最大的n个元素组成的列表。key是一个可选参数,它指定一个具有一个参数的函数,该函数用于从可迭代对象的每个元素中提取比较键值:key=str.lower 相当于:sorted(iterable, key=key, reverse=True)[:n]

输出:

>>> my_list = [('Item no.1', 3), ('Item no.2', 0),
...            ('Item no.3', 3), ('Item no.4', 2),
...            ('Item no.5', 1), ('Item no.6', 9),
...            ('Item no.7', 7)]
>>>
>>> nlargest(5, my_list, key=itemgetter(1))
[('Item no.6', 9), ('Item no.7', 7), ('Item no.1', 3), ('Item no.3', 3), ('Item no.4', 2)]

1
你比我更快了。我刚删除了我的答案,但我会使用 operator.itemgetter 代替 lambda 来作为 key! - juanpa.arrivillaga
@juanpa.arrivillaga 编辑后使用 operator.itemgetter() 替代了 lambda ;) - ettanany

2
sorted(itemsAndQtyBought, key=lambda item: item[1], reverse=True)[:5]

输出:

[('Item no.6', 9), ('Item no.7', 7), ('Item no.1', 3), ('Item no.3', 3), ('Item no.4', 2)]

唯一的缺点是:它会对整个列表进行排序。

0

希望它能帮到你

from operator import itemgetter

def newItem(oldItem):
        newItemQtyBought = sorted(oldItem,key=itemgetter(1))
        return newItemQtyBought[-5:]

def main():
        itemsAndQtyBought = [('Item no.1', 3), ('Item no.2', 0), ('Item no.3', 3), ('Item no.4', 2), ('Item no.5', 1), ('Item no.6', 9), ('Item no.7', 7)]
        print(newItem(itemsAndQtyBought))

if __name__=="__main__":
        main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接