我正在从事诸如库存管理之类的工作,我被困于通过某种条件对双品项进行分类和添加。我的代码在下面,其对数据的正常工作在列表“ print(c.data_dict)”中
import datetime
from itertools import groupby
from operator import itemgetter
class Supplier:
def __init__(self, name, address, email, contact_no):
self.name = name
self.address = address
self.email = email
self.contact_no = contact_no
class Product:
def __init__(self, name):
self.name = name
class Company(Supplier, Product):
data_dict = []
def purchase(self, supplier_obj, product_obj, qty, date):
self.data_dict.append({'supplier': supplier_obj.name, 'product': product_obj.name, 'qty': qty, 'date': date})
return self.data_dict
s1 = Supplier('Amazon', 'kalawad road', 'amazon@gmail.com', '987686')
s2 = Supplier('Flipkart', 'university road', 'flipkart@gmail.com', '657457')
s3 = Supplier('Alibaba', 'china town road', 'alibaba@qq.com', '365213')
p1 = Product('Laptop')
p2 = Product('printer')
p3 = Product('computer')
c = Company(None, None, None, None)
c.purchase(s1, p1, 10, '2019-10-10')
c.purchase(s1, p1, 10, '2019-10-10')
c.purchase(s1, p2, 20, '2018-11-11')
c.purchase(s1, p2, 30, '2018-12-12')
c.purchase(s1, p3, 40, '2016-10-10')
c.purchase(s2, p3, 10, '2019-11-11')
c.purchase(s2, p3, 11, '2019-11-11')
c.purchase(s3, p1, 6, '2019-03-04')
c.purchase(s3, p3, 9, '2019-02-02')
print(c.data_dict)
我得到包含类似
的列表[{'supplier': 'Amazon', 'product': 'Laptop', 'qty': 10, 'date': '2019-10-10'},
{'supplier': 'Amazon', 'product': 'Laptop', 'qty': 10, 'date': '2019-10- 10'},
{'supplier': 'Amazon', 'product': 'printer', 'qty': 20, 'date': '2018-11-11'},
{'supplier': 'Amazon', 'product': 'printer', 'qty': 30, 'date': '2018-12-12'},
{'supplier': 'Amazon', 'product': 'computer', 'qty': 40, 'date':'2016-10-10'},
{'supplier': 'Flipkart', 'product': 'computer', 'qty': 10,'date': '2019-11-11'},
{'supplier': 'Flipkart', 'product': 'computer', 'qty': 11, 'date': '2019-11-11'},
{'supplier': 'Alibaba', 'product': 'Laptop', 'qty': 6, 'date': '2019-03-04'},
{'supplier': 'Alibaba', 'product':'computer', 'qty': 9, 'date': '2019-02-02'}]
其中Amazon,FLipkart和allibaba是供应商名称,Laptop-Printer-Computer是产品名称,qty是数量和日期。
我正在尝试按上面的方式进行排序,以便在同一供应商提供相同日期的情况下,应添加数量。例如。在亚马逊上-打印机数量应为50,如输出所示。我该怎么做? 我已经尝试过使用itertool和operator模块来完成它,但是没有得到正确的输出。
我的过期输出是
sample output
Amazon
01-01-2019 laptop 10
02-02-1019 laptop 10
03-03-2019 printer 50
03-03-2019 computer 40
Flipkart
01-01-2019 computer 10
31-01-2019 computer 11
Alibaba
2019-03-04 laptop 6
2019-02-02 computer 6
答案 0 :(得分:1)
用柜台做繁重的事情。
>>> from collections import Counter
>>> counter = Counter()
>>> for d in c.data_dict:
counter[d['supplier'],d['product'],d['date']] += d['qty']
得出每个供应商,产品和日期的总数:
>>> counter
Counter({('Amazon', 'computer', '2016-10-10'): 40, ('Amazon', 'printer', '2018-12-12'): 30, ('Flipkart', 'computer', '2019-11-11'): 21, ('Amazon', 'printer', '2018-11-11'): 20, ('Amazon', 'Laptop', '2019-10-10'): 10, ('Amazon', 'Laptop', '2019-10- 10'): 10, ('Alibaba', 'computer', '2019-02-02'): 9, ('Alibaba', 'Laptop', '2019-03-04'): 6})
要按供应商,产品和日期分类打印出来,可以执行此操作。您的样本输出与问题中样本输入中的日期不一致,因此结果不相同。
>>> for (supplier, product, date), qty in sorted(counter.items()):
print(supplier, product, date, qty)
('Alibaba', 'Laptop', '2019-03-04', 6)
('Alibaba', 'computer', '2019-02-02', 9)
('Amazon', 'Laptop', '2019-10- 10', 10)
('Amazon', 'Laptop', '2019-10-10', 10)
('Amazon', 'computer', '2016-10-10', 40)
('Amazon', 'printer', '2018-11-11', 20)
('Amazon', 'printer', '2018-12-12', 30)
('Flipkart', 'computer', '2019-11-11', 21)
在format()
调用中向print()
添加一个调用以使其美观。
答案 1 :(得分:0)
我认为这里的问题是您不是真正在尝试排序,而是在尝试转换数据
如果我正确地理解公司在同一天从同一供应商处购买了他们已经购买的产品,那么我们应该添加数量。
一种简单的方法是将此逻辑添加到购买功能
def purchase(self, supplier_obj, product_obj, qty, date):
for purchase in self.data_dict:
if purchase['supplier'] == supplier_obj.name and purchase['product'] == product_obj.name and purchase['date'] == date:
purchase['qty']+=qty
return self.data_dict
self.data_dict.append({'supplier': supplier_obj.name, 'product': product_obj.name, 'qty': qty, 'date': date})
return self.data_dict
一种更有效的方法是将数据存储在大型词典中,只有在调用print时,才将其格式化为所需的格式。上面的代码应该可以正确格式化列表。
答案 2 :(得分:0)
在这里,您可以删除重复项,并将同一天和同一家公司添加的相同产品汇总在一起。
new_data = []
for entry in data:
if entry not in new_data:
for i in new_data:
if all([entry['product'] == i['product'],
entry['supplier'] == i['supplier'],
entry['date'] == i['date']]):
i['qty'] += entry['qty']
break
new_data.append(entry)
print(*new_data, sep='\n')
输出:
{'date': '2019-10-10', 'product': 'Laptop', 'supplier': 'Amazon', 'qty': 10}
{'date': '2018-11-11', 'product': 'printer', 'supplier': 'Amazon', 'qty': 20}
{'date': '2018-12-12', 'product': 'printer', 'supplier': 'Amazon', 'qty': 30}
{'date': '2016-10-10', 'product': 'computer', 'supplier': 'Amazon', 'qty': 40}
{'date': '2019-11-11', 'product': 'computer', 'supplier': 'Flipkart', 'qty': 21}
{'date': '2019-11-11', 'product': 'computer', 'supplier': 'Flipkart', 'qty': 11}
{'date': '2019-03-04', 'product': 'Laptop', 'supplier': 'Alibaba', 'qty': 6}
{'date': '2019-02-02', 'product': 'computer', 'supplier': 'Alibaba', 'qty': 9}
答案 3 :(得分:0)
在如何轻松修改数据方面,我玩得很开心。 这不是最漂亮的方法,如果您希望在不将代码更改太多的情况下获得有效的效果,请参考Filip的答案。
import datetime
import attr
Supplier= attr.make_class('Supplier',['name', 'address', 'email', 'contact_no', 'purchase_per_date_per_product'])
Product = attr.make_class('Product',['name'])
Purchase = attr.make_class('Purchase',['supplier', 'product','qty','date'])
class Company():
data_dict = {}
def add_purchase(self, supplier_obj, product_obj, qty, date):
if [product_obj,date] in supplier_obj.purchase_per_date_per_product:
self.data_dict[supplier_obj.name][date][product_obj.name]+= qty
else:
if supplier_obj.name not in self.data_dict:
self.data_dict[supplier_obj.name]={}
supplier_obj.purchase_per_date_per_product += [[product_obj,date]]
self.data_dict[supplier_obj.name][date]={product_obj.name:qty}
return self.data_dict