python - 从值是对象列表的字典中查找最小值
问题描述
我有一个服务类型的 Python 对象列表。还有另一个字典grps
,其中根据数据成员对对象进行分组。同一组中的对象对其分组所依据的数据成员具有完全相同的值。
from collections import defaultdict
class service:
def __init__(self, tasknum, candidatenum, features, cost):
self.tasknum = tasknum
self.candidatenum = candidatenum
self.features = features
self.cost = cost
s11 = service(1,1, features = [1], cost = 30)
s12 = service(1,2, features = [1], cost = 50)
s13 = service(1,3, features = [1], cost = 70)
s14 = service(1,4, features = [1], cost = 200)
s15 = service(1,5, features = [2], cost = 20)
lst = []
lst.append(s11)
lst.append(s12)
lst.append(s13)
lst.append(s14)
lst.append(s15)
grps = defaultdict(list)
for x in lst:
grps[tuple(x.features)].append(x)
上面有两组,一组对应features = [1]
,一组对应features = [2]
。
defaultdict(<class 'list'>, {(1,): [<__main__.service object at 0x7efe19a2d6d8>, <__main__.service object at 0x7efe19a2d4e0>, <__main__.service object at 0x7efe1d7e9550>, <__main__.service object at 0x7efe1d7e9588>], (2,): [<__main__.service object at 0x7efe1d7e95c0>]})
对于每个这样的组,我想返回一个具有最小成本值的服务对象,也就是说,在上面,第一组将返回s11
服务,第二组将返回s15
服务,因为这是组中唯一的对象。
有没有更好的方法可以在不使用字典的情况下做到这一点,比如只使用列表就可以做到吗?
解决方案
在列表推导中,您可以调用min()
组的每个成员并使用获取cost
属性的键。operator.attrgetter
方便:
from operator import attrgetter
# array of min-cost services
mins = [min(g, key = attrgetter('cost')) for g in grps.values()]
# just the costs
[c.cost for c in mins] # [30, 20]
推荐阅读
- android - Android Emulator 自定义硬件配置文件的应用程序大小不正确
- angular - 在角度中找不到模块文件保护程序
- xcode - 没有为“ProduceIncludeFrameworksCommand”任务提供所需参数“XcodePath”的值
- php - phpmyadmin/sql-parser 到 AST
- windows - 本地计算机上的 Windows 服务启动然后停止时间范围
- espeak - 如何从 espeak-ng 中删除语言
- django-rest-knox - 颤振的django-rest-knox注销问题
- mapbox - 无法通过带有 mapbox 的 Camera2 API 访问 USB 相机
- linux - 如何使用 docker stats 打印时间戳
- python - 如何从包含列表的字典中的特定值中获取键