Python中按组划分的最大值

2024-07-03 06:59:25 发布

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

我有一个python列表。列表列表上的每个值由[类别、类型、项目、分数]表示。对于每个类别和类型,我想返回一个得分最高的项目列表

[["Edibles", "Fruit", "Apple", 3],
"Edibles", "Fruit", "Grapes", 8],
"Edible", "Candy", "Hershey", 4],
"Edible", "Candy", "Snickers", 6],
"NonEdible", "Bikes", "Yamaha", 5],
"NonEdible", "Bikes", "Suzuki", 7],
"NonEdible", "Cars", "Kia", 8],
"NonEdible", "Cars", "Toyota", 9]]

期望输出

[["Edibles", "Fruit", "Grapes", 8],
"Edible", "Candy", "Snickers", 6],
"NonEdible", "Bikes", "Suzuki", 7],
"NonEdible", "Cars", "Toyota", 9]]

我可以通过创建临时列表的多个循环来实现这一点,但是随着输入大小的增加,计算变得非常缓慢。我在寻找一个有效的解决方案


Tags: 项目类型列表类别carsfruitcandysuzuki
3条回答

您可以使用^{},但需要在分组前对列表进行排序:

from itertools import groupby

lst = [["Edibles", "Fruit", "Apple", 3],
["Edibles", "Fruit", "Grapes", 8],
["Edible", "Candy", "Hershey", 4],
["Edible", "Candy", "Snickers", 6],
["NonEdible", "Bikes", "Yamaha", 5],
["NonEdible", "Bikes", "Suzuki", 7],
["NonEdible", "Cars", "Kia", 8],
["NonEdible", "Cars", "Toyota", 9]]

#if lst is already sorted, skip this step:
lst = sorted(lst, key=lambda k: (k[0], k[1]))

out = [max(g, key=lambda k: k[-1]) for _, g in groupby(lst, lambda k: (k[0], k[1]))]

from pprint import pprint
pprint(out)

印刷品:

[['Edible', 'Candy', 'Snickers', 6],
 ['Edibles', 'Fruit', 'Grapes', 8],
 ['NonEdible', 'Bikes', 'Suzuki', 7],
 ['NonEdible', 'Cars', 'Toyota', 9]]

一本简单的字典既快捷又高效

(您的列表格式不正确-没有每个子列表的左括号)
你可以用字典一次完成:

input = [["Edibles", "Fruit", "Apple", 3],
    ["Edibles", "Fruit", "Grapes", 8],
    ["Edible", "Candy", "Hershey", 4],
    ["Edible", "Candy", "Snickers", 6],
    ["NonEdible", "Bikes", "Yamaha", 5],
    ["NonEdible", "Bikes", "Suzuki", 7],
    ["NonEdible", "Cars", "Kia", 8],
    ["NonEdible", "Cars", "Toyota", 9]
]

highest_val_dict = {}
for curr_list in input:
    curr_key = (curr_list[0], curr_list[1])  # (category,type) is the key
    curr_item = curr_list[2]
    curr_val = curr_list[3]
    highest_pair = highest_val_dict.get(curr_key, (None, -1))
    if curr_val > highest_pair[1]:
        highest_val_dict[curr_key] = (curr_item, curr_val)

>>> for key, val in highest_val_dict.items():
>>>     print(f'{key[0]}, {key[1]}, {val[0]}, {val[1]}')
Edibles, Fruit, Grapes, 8
Edible, Candy, Snickers, 6
NonEdible, Bikes, Suzuki, 7
NonEdible, Cars, Toyota, 9

您可以使用pandas库执行以下操作:

安装熊猫,如:

pip install pandas

您的代码是:

In [2271]: import pandas as pd

In [2272]: l = [["Edibles", "Fruit", "Apple", 3], 
      ...: ["Edibles", "Fruit", "Grapes", 8], 
      ...: ["Edible", "Candy", "Hershey", 4], 
      ...: ["Edible", "Candy", "Snickers", 6], 
      ...: ["NonEdible", "Bikes", "Yamaha", 5], 
      ...: ["NonEdible", "Bikes", "Suzuki", 7], 
      ...: ["NonEdible", "Cars", "Kia", 8], 
      ...: ["NonEdible", "Cars", "Toyota", 9]] 

In [2275]: df = pd.DataFrame(l, columns=['category','type','item','score'])

In [2284]: df.groupby(['category','type'], as_index=False).agg(max).values.tolist()
Out[2284]: 
[['Edible', 'Candy', 'Snickers', 6],
 ['Edibles', 'Fruit', 'Grapes', 8],
 ['NonEdible', 'Bikes', 'Yamaha', 7],
 ['NonEdible', 'Cars', 'Toyota', 9]]

相关问题 更多 >