gpt4 book ai didi

python - 如何检查对象列表中的重复属性并合并它们

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:59 25 4
gpt4 key购买 nike

我有一个具有属性 qtconsconsper 的对象列表,并且必须合并具有相同 的所有对象>consper 值。最好的方法是什么?该列表已按 consper 排序。

例子:使用 house 类的对象列表:

class house():
def __init__(self, qt, cons, consper):
self.qt = qt
self.cons = cons
self.consper = consper

打开这个列表:

l = [
house(2, 20, 10),
house(3, 31, 10),
house(6, 70, 11),
house(2, 40, 20),
house(1, 25, 25)]

进入此列表:

l_new = [
house(5, 51, 10),
house(6, 70, 11),
house(2, 40, 20),
house(1, 25, 25)]

通过添加前两个对象(因为它们的属性consper是等价的)

最佳答案

如果项目已经按该属性排序,您可以使用 itertools.groupby 获取组并使用 sum 获取其他属性的总和。您还必须首先将组转换为 list,因为它们是迭代器。

>>> from itertools import groupby
>>> house.__repr__ = lambda h: "house(%r, %r, %r)" % (h.qt, h.cons, h.consper)
>>> [house(sum(h.qt for h in g), sum(h.cons for h in g), k)
... for k, g in ((k, list(g)) for k, g in groupby(l, key=lambda h: h.consper))]
[house(5, 51, 10), house(6, 70, 11), house(2, 40, 20), house(1, 25, 25)]

或者使用字典:

>>> d = {}
>>> for h in l:
... qt, cons = d.get(h.consper, (0, 0))
... d[h.consper] = qt + h.qt, cons + h.cons
...
>>> [house(a, b, c) for a, (b, c) in d.items()]
[house(25, 1, 25), house(10, 5, 51), house(11, 6, 70), house(20, 2, 40)]

关于python - 如何检查对象列表中的重复属性并合并它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48645730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com