获取密钥总数小于或等于X的前5个值

Dar*_*ter 7 python python-2.7

目前我有一个人可以购买的物品清单如下:

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),
]
Run Code Online (Sandbox Code Playgroud)

每个项目都设置如下:

('Item Name', ItemCost, ItemValue)
Run Code Online (Sandbox Code Playgroud)

我有列表拉前五名的项目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),
    ]
Run Code Online (Sandbox Code Playgroud)

我试图检索一个结果,我得到ItemValue前5名总数ItemCost相等或小于6 的前5名.

有什么建议?

raf*_*elc 6

您可以先过滤,然后nlargest在过滤后的列表中使用以下所有内容.

f = [(a,b,c) for (a,b,c) in my_list if b <= 6]
Run Code Online (Sandbox Code Playgroud)

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

df = pd.DataFrame(my_list, columns=('ItemName', 'ItemCost', 'ItemValue'))

    ItemName    ItemCost    ItemValue
0   Candy       1.0         20.500
1   Soda        3.0         10.250
2   Coffee      1.2         20.335
3   Soap        1.2         11.500
4   Spoon       0.2         2.320
5   Toast       3.2         12.335
6   Toothpaste  3.0         20.500
7   Creamer     0.1         5.500
8   Sugar       2.2         5.200

>>> df[df.ItemCost <= 6]

    ItemName    ItemCost    ItemValue
0   Candy       1.0         20.500
1   Soda        3.0         10.250
2   Coffee      1.2         20.335
3   Soap        1.2         11.500
4   Spoon       0.2         2.320
5   Toast       3.2         12.335
6   Toothpaste  3.0         20.500
7   Creamer     0.1         5.500
8   Sugar       2.2         5.200

>>> df[df.ItemCost <= 6].nlargest(n=5, columns=['ItemValue'])


    ItemName    ItemCost    ItemValue
0   Candy       1.0         20.500
6   Toothpaste  3.0         20.500
2   Coffee      1.2         20.335
5   Toast       3.2         12.335
3   Soap        1.2         11.500
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以先拿到nsmallestItemCost,并就在这时得到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
Run Code Online (Sandbox Code Playgroud)