获取键值总和小于或等于X的前5个值

2024-06-02 06:14:55 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我有一个清单,有人可以购买如下项目:

my_list = [
    ('Candy', 1.0, 20.5),
    ('Soda', 3.0, 10.25),
    ('Coffee', 1.2, 20.335),
    ('Soap', 1.2, 11.5),
    ('Spoon', 0.2, 2.32),
    ('Toast', 3.2, 12.335),
    ('Toothpaste', 3, 20.5),
    ('Creamer', .1, 5.5),
    ('Sugar', 2.2, 5.2),
]

每个项目的设置如下:

^{pr2}$

我有一个列表,其中列出了前5个ItemValue。在

print nlargest(5, my_list, key=itemgetter(2))
>>> [
        ('Candy', 1.0, 20.5),
        ('Toothpaste', 3, 20.5),
        ('Coffee', 1.2, 20.335),
        ('Toast', 3.2, 12.335),
        ('Soap', 1.2, 11.5),
    ]

我试图检索一个结果,其中我得到前5个总数ItemValue,其中前5个总数ItemCost等于或小于6。在

有什么建议吗?在


Tags: 项目mysugarsoaplistcoffee总数toast
3条回答

您可以先进行筛选,然后在筛选列表中使用以下所有nlargest。在

f = [(a,b,c) for (a,b,c) in my_list if b <= 6]

但是对于这样的数据操作,pandas可能非常有用。举个例子

^{pr2}$

如果你愿意,你可以先得到ItemCostnsmallest,然后得到nlargest

df.nsmallest(n=5, columns=['ItemCost']).nlargest(n=5, columns=['ItemValue'])    

    ItemName    ItemCost    ItemValue
0   Candy       1.0         20.500
2   Coffee      1.2         20.335
3   Soap        1.2         11.500
7   Creamer     0.1         5.500
4   Spoon       0.2         2.320

不知道这是不是你要的

我首先从我的列表中创建5个元素的所有可能的组合

itertools.combinations(my_list, 5)

然后我会在结果中找到所有可能的组合,其中总项目成本将小于或等于6。在

^{pr2}$

现在,我将找到total itemValue最大的元素

h = [sum([g[2] for g in e]) for e in f]

itemValue最大的元素的索引为

index = h.index(max(h))

现在,你可以在f中找到这个元素

f[index]

我得到的答案是

 Candy        1.0  20.5
 Coffee       1.2  20.335
 Spoon        0.2  2.32
 Toothpaste   3    20.5
 Creamer      0.1  5.5

首先要按ItemCost筛选列表:

  • 可以通过:filtered_generator = filter(lambda x: x[1] <= 6, my_list)

  • 或者以更像python的方式filtered_list = [x for x in my_list if x[1] <=6]

  • 为了使它成为一个生成器来节省内存,只需使用括号而不是方括号。

然后要得到n个最大的项目:

  • 您可以使用heapq.nlargest:nlargest(5, filtered_iter, key=lambda x:x[2])
  • 或者自己实现类似的功能。在

filtered_iter可以是列表或生成器之一。在

相关问题 更多 >