我有多家有啤酒的啤酒厂。有些是一样的。我需要给一家公司逐项列出总数。此代码遍历查询集,查找重复名称,汇总数量,然后将其添加到字典中。如果没有复制,它就直接进入字典。我是Python和Django的新手,所以代码既简单又笨重。请给我建议更优雅和简洁的方法来解决这个问题。谢谢!
def index_inventory(request):
keg_totals = {}
keg_data = Kegs.objects.all()
counter = 0
for keg in keg_data:
counter2 = counter + 1
while counter2 <= (len(keg_data)) -1:
if (keg_data[counter].beer) == (keg_data[counter2].beer):
(keg_data[counter2].quantity) =(keg_data[counter2].quantity)+
(keg_data[counter].quantity)
counter2 += 1
else:
keg_totals[keg.beer] = keg.quantity
counter2 += 1
counter += 1
context = {
'keg_totals' : keg_totals,
}
return render(request, 'inventory/index_inventory.html', context),<桶:33 State 7.75 -10>,,<桶:新鲜收获15 -30>,<桶:锤头15 -15>,,,,,,,,,,> -0>>-5>
名称和桶的大小与数量。
发布于 2022-05-29 02:57:47
假设你有一堆桶:
class Keg:
def __init__(self, beer, quantity):
self.beer = beer
self.quantity = quantity
kegs = [
Keg("Ale", 10),
Keg("Lager", 25),
Keg("Ale", 2),
Keg("Stout", 4),
Keg("Lager", 10)
]你可以这样做:
from itertools import groupby
from operator import attrgetter
key = attrgetter("beer")
keg_totals = { beer: sum(keg.quantity for keg in group) for beer, group in groupby(sorted(kegs, key=key), key=key)}
print(keg_totals)输出:
{'Ale': 12, 'Lager': 35, 'Stout': 4}解释:
首先,我们通过sorted(kegs, key=attrgetter("beer"))创建桶集合的排序版本。我们是基于key进行排序的,在本例中,这意味着我们根据每个桶的beer属性的字典顺序进行排序(我们根据beer名称按字母顺序排序):
[
Keg("Ale", 10),
Keg("Ale", 2),
Keg("Lager", 25),
Keg("Lager", 10),
Keg("Stout", 4)
]然后,我们根据这个排序集合中的桶创建一个组列表,它们彼此相邻,并通过beer共享相同的groupby名称。
[
[ Keg("Ale", 10), Keg("Ale", 2)],
[ Keg("Lager", 25), Keg("Lager", 10)],
[ Keg("Stout", 4)]
]在这个例子中,我们有三个组。
然后,使用字典理解,生成一个字典:对于组列表中的每个组,将当前键设置为与当前组相关联的beer名称,并将当前值设置为当前组中所有桶的所有数量之和。
https://stackoverflow.com/questions/72420531
复制相似问题