сортировать список (многомерный) по его элементу в python - PullRequest
0 голосов
/ 22 марта 2019

мой код

class Supplier:
def supplier_name(self, sup_name):
    return sup_name


class Product(Supplier):

def purchase(self, date, p_name, qty):
    p_list = [date, p_name, qty]
    return p_list


x = s.supplier_name("A")
pr_name = "product B"
unit_row = p.purchase("2018-12-12", pr_name, 20)
c.get_data(unit_row, x)


x = s.supplier_name("A")
pr_name = "product A"
unit_row = p.purchase("2019-10-10", pr_name, 5)
c.get_data(unit_row, x)


x = s.supplier_name("B")
pr_name = "product A"
unit_row = p.purchase("2018-11-15", pr_name, 7)
c.get_data(unit_row, x)


x = s.supplier_name("B")
pr_name = "product B"
unit_row = p.purchase("2018-11-16", pr_name, 9)
c.get_data(unit_row, x)


x = s.supplier_name("B")
pr_name = "product C"
unit_row = p.purchase("2018-12-15", pr_name, 10)
c.get_data(unit_row, x)


x = s.supplier_name("C")
pr_name = "product A"
unit_row = p.purchase("2018-06-10", pr_name, 20)
c.get_data(unit_row, x)


x = s.supplier_name("C")
pr_name = "product B"
unit_row = p.purchase("2018-07-10", pr_name, 30)
c.get_data(unit_row, x)


x = s.supplier_name("C")
pr_name = "product A"
unit_row = p.purchase("2018-06-10", pr_name, 40)
c.get_data(unit_row, x)

c.display()

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

[['2019-10-10', 'product A', 10], 'A']
[['2019-10-10', 'product A', 5], 'A']
[['2018-12-15', 'product C', 10], 'B']
[['2018-12-12', 'product B', 20], 'A']
[['2018-11-16', 'product B', 9], 'B']
[['2018-11-15', 'product A', 7], 'B']
[['2018-07-10', 'product B', 30], 'C']
[['2018-06-10', 'product A', 20], 'C']
[['2018-06-10', 'product A', 40], 'C']

здесь 'A' 'B' 'C' - мой поставщик, «продукт A», «продукт B» и «продукт C» - это название моего продукта. и цифры мои кол-во (например, 10,5,10,20,9,7,30,20,40)

Я хочу добавить к той же дате с тем же поставщиком кол-во. (например, 10 + 5) у поставщика «А» и еще один в количестве 20 + 40 у поставщика 'C' и перечислите их индивидуально, как показано ниже. ожидаемый результат.

[['2019-10-10', 'product A', 15], 'A']
[['2018-12-12', 'product B', 20], 'A']

[['2018-12-15', 'product C', 10], 'B']
[['2018-11-16', 'product B', 9], 'B']
[['2018-11-15', 'product A', 7], 'B']

[['2018-07-10', 'product B', 30], 'C']
[['2018-06-10', 'product A', 60], 'C']

1 Ответ

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

Вы можете использовать defaultdict:

from collections import defaultdict

l = [[['2019-10-10', 'product A', 10], 'A'],
    [['2019-10-10', 'product A', 5], 'A'],
    [['2018-12-15', 'product C', 10], 'B'],
    [['2018-12-12', 'product B', 20], 'A'],
    [['2018-11-16', 'product B', 9], 'B'],
    [['2018-11-15', 'product A', 7], 'B'],
    [['2018-07-10', 'product B', 30], 'C'],
    [['2018-06-10', 'product A', 20], 'C'],
    [['2018-06-10', 'product A', 40], 'C']]

d = defaultdict(int)

for i in l:
    d[(*i[0][:2], i[1])] += i[0][2]

for k, v in d.items():
    print([[*k[:2], v], k[-1]])    

Выход:

[['2019-10-10', 'product A', 15], 'A']
[['2018-12-15', 'product C', 10], 'B']
[['2018-12-12', 'product B', 20], 'A']
[['2018-11-16', 'product B', 9], 'B']
[['2018-11-15', 'product A', 7], 'B']
[['2018-07-10', 'product B', 30], 'C']
[['2018-06-10', 'product A', 60], 'C']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...