【问题标题】:how to sort dictionary inside list and manipulate data?如何对列表中的字典进行排序并操作数据?
【发布时间】:2019-03-28 15:52:38
【问题描述】:

我正在处理库存管理之类的工作,我被困在某些条件下分类和添加重复项目。我的代码在下面,它的工作正常到数据在列表“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

【问题讨论】:

    标签: python python-3.x python-2.7 dictionary inventory-management


    【解决方案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)
    

    print() 调用中添加对format() 的调用以使其美观。

    【讨论】:

      【解决方案2】:

      我认为这里的问题是您并没有真正尝试排序,而是尝试转换数据

      如果我理解正确,当公司购买他们在同一天从同一供应商处购买的产品时,我们应该添加数量。

      一种简单的方法是将此逻辑添加到购买功能中

      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 时才能将其格式化为您想要的方式。上面的代码应该正确格式化您的列表。

      【讨论】:

        【解决方案3】:

        您可以通过以下方式删除重复项并将同一天和同一家公司添加的相同产品汇总在一起。

        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}
        

        【讨论】:

          【解决方案4】:

          关于如何轻松修改数据,我玩得很开心。 这不是最漂亮的方式,如果你想要一些有效的东西而不改变你的代码,请参考 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
          

          【讨论】:

            猜你喜欢
            • 2018-09-27
            • 2018-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-23
            • 2021-12-29
            • 2014-07-13
            • 1970-01-01
            相关资源
            最近更新 更多