gpt4 book ai didi

python - 根据某些属性合并对象并组合(求和)某些其他属性

转载 作者:行者123 更新时间:2023-12-01 01:34:10 28 4
gpt4 key购买 nike

假设我有 MyObject,其属性为 attr_aattr_battr_c 以及 quantity。

如果它们具有相同的 attr_aattr_battr_c,我想合并它们的数量

这是一个例子和我的方法。有一个更好的方法吗?例如;如果我想在组合列表后保留它们的顺序该怎么办?

class MyObject:
def __init__(self, attr_a, attr_b, attr_c, quantity):
self.attr_a = attr_a
self.attr_b = attr_b
self.attr_c = attr_c
self.quantity = quantity

def __eq__(self, rhs):
if type(rhs) is type(self):
return self.attr_a == rhs.attr_a and self.attr_b == rhs.attr_b and self.attr_c == rhs.attr_c
else:
return False

def __hash__(self):
return hash((self.attr_a, self.attr_b, self.attr_c))

def __repr__(self):
return "<{}, {}, {}, {}>".format(self.attr_a, self.attr_b, self.attr_c, self.quantity)


from collections import defaultdict

pos1 = [MyObject("AAA", "BBB", "A123", 1000), MyObject("AAA", "CCC", "A123", 2000)]
pos2 = [MyObject("AAA", "BBB", "A123", 2000), MyObject("AAA", "CCC", "A123", -2000), MyObject("AAA", "DDD", "A999", 200)]

merge = defaultdict(int)

for p in pos1 + pos2:
merge[p] += p.quantity

res = []
for k, v in merge.items():
k.quantity = v
res.append(k)

print(res)

"""
Expected output: [<AAA, BBB, A123, 3000>, <AAA, CCC, A123, 0>, <AAA, DDD, A999, 200>]
"""

最佳答案

嗯,我认为针对特定用例“定制” __eq__ 等功能并不是一个好主意:现在这意味着 MyObject("AAA", "BBB", "A123", 1000) 被视为等于 MyObject("AAA", "BBB", "A123", 1425)。对于将这些对象“合并”在一起的用例,这可能有效,但这意味着其他(直接的)用例可能会导致很多额外的逻辑。

我要避免的另一件事是更改现有MyObject的数量:您不知道哪些变量指向该对象。因此,这可能意味着包含 MyObject 的列表突然出现一个数量 不同的列表。

最好实现像 get_key 这样的函数:

class MyObject:
def __init__(self, attr_a, attr_b, attr_c, quantity):
self.attr_a = attr_a
self.attr_b = attr_b
self.attr_c = attr_c
self.quantity = quantity

<b>def get_key(self):
return (self.attr_a, self.attr_b, self.attr_c)</b>

def __repr__(self):
return "<{}, {}, {}, {}>".format(self.attr_a, self.attr_b, self.attr_c, self.quantity)

然后我们执行或多或少相似的算法,但我们构造新的 MyObject:

from collections import defaultdict
res = defaultdict(int)

for obj in objs:
res[obj.get_key()] += obj.quantity

result = [MyObject(*k, v) for k, v in res.items()]

制作某种clone函数来复制MyObject以及新的数量也可能会改善代码设计。

关于python - 根据某些属性合并对象并组合(求和)某些其他属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52540149/

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