Добавление и сортировка элементов многомерного списка определенным образом - PullRequest
0 голосов
/ 24 марта 2019

Я работаю над этим

class Product:
    def __init__(self, date=0, product_name=0,qty=0,supplier=0):
        self.product_name = product_name
        self.date = date
        self.qty = qty
        self.supplier= supplier
        self.my_list = []

    def purchase(self, date, product_name, qty, supplier_name ):
         self.my_list.append([supplier_name,date,product_name,qty])

    def calculation(self):
        for i in self.my_list:
           print(i)


choice=None
p=Product()
while True:
    choice=int(input("1 for the add record\n2 For the display result.\n"))
    if choice == 1:
        product_name=input("Enter the product name\n")
        qty = int(input("Enter the qty.\n"))
        date= input("Enter the date")
        supplier_name = input("Enter the supplier name.\n ")
        p.purchase(date,product_name,qty, supplier_name)

    elif choice == 2:
        p.calculation()

после выполнения этого я добавил данные, подобные этим ... когда мы выбираем опцию 2 числа, у меня есть такие данные

eg.[supplier_name, date, product_name, quantity]

[supplierA, 2019-01-01, pencil, 20]
[supplierA, 2019-01-01, pencil, 30]
[supplierA, 2018-02-02, pen, 20]
[supplierB, 2017-02-02, scale, 10]
[supplierB, 2017-10-10, scale, 20]
[supplierC, 2019-01-01, pencil,10]
[supplierC, 2019-01-01, pencil,10]
[supplierC, 2019-01-01, pencil,10]    

Я хочу отфильтровать эти данные таким образом, чтобы, если дата и название продукта совпадали, необходимо было добавить их количество.и оно должно быть сгруппировано по имени поставщика. Я имею в виду, что в

expected output is 

Supplier A:
[2019-01-01, pencil, 50]
[2018-02-02, pen, 20]

Supplier B:
[2017-02-02, scale, 10]
[2017-10-10, scale, 20]

Supplier C:
[2019-01-01, pencil, 30]

я добавил только дату и количество отдельных поставщиков, которые я пробовал с лямбда-фильтрами, но не смог сделать это.есть идеи как сделать это возможным?

Ответы [ 3 ]

0 голосов
/ 24 марта 2019

Вы также можете изменить существующий метод покупки:

def purchase(self, date, product_name, qty, supplier_name ):
    for item in self.my_list:
        if item[2] == product_name and item[1] == date and item[0] == supplier_name:
            item[3] = item[3] + qty
            return
    self.my_list.append([supplier_name,date,product_name,qty])
0 голосов
/ 24 марта 2019

Вы можете сделать это:

from itertools import groupby
from operator import itemgetter

    def calculation(self):
        # sort and group items by supplier_name, date, product_name
        x = groupby(sorted(self.my_list, key=itemgetter(slice(None, 3))), itemgetter(slice(None, 3)))
        # sum the quantities
        y = [i + [sum(map(itemgetter(3), j))] for i, j in x]
        # group items by supplier
        z = [(i, list(map(itemgetter(slice(1, None)), j))) for i, j in groupby(y, itemgetter(0))]
        # output
        for supplier, values in z:
            print("{0}:".format(supplier))
            print("\n".join(map(str, values)))
0 голосов
/ 24 марта 2019

это будет работать, я думаю:

class Product:
    #init
    def __init__(self, date=0, product_name=0,qty=0,supplier=0):
        self.product_name = product_name
        self.date = date
        self.qty = qty
        self.supplier= supplier
        #make self.my_dict
        self.my_dict={}

    def purchase(self, date, product_name, qty, supplier_name ):
        #make a new key if needing
         try:
             #add the data to the list
             self.my_dict[supplier_name].append([date,product_name,qty])
         except:
             #make a new list with data
             self.my_dict[supplier_name] = [[date,product_name,qty]]

    def calculation(self):
        #getting keys
        for i in list(self.my_dict):
            #print key
            print(i)
            #get items
            for k in self.my_dict[i]:
                #print item
                print(k)


choice=None
p=Product()
while True:
    choice=int(input("1 for the add record\n2 For the display result.\n"))
    if choice == 1:
        product_name=input("Enter the product name\n")
        qty = int(input("Enter the qty.\n"))
        date= input("Enter the date")
        supplier_name = input("Enter the supplier name.\n ")
        p.purchase(date,product_name,qty, supplier_name)

    elif choice == 2:
        p.calculation()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...