Вы можете использовать словарь (идеально: collections.defaultdict
) для сбора данных, а затем использовать dict.items()
для создания вашего формата:
from collections import defaultdict
products = ['Product1','Product1','Product1','Product2','Product2','Product2']
values = [1,-1,0,2,4,-1]
d = defaultdict(list)
# accumulate your data
for prod,val in zip(products,values):
d[prod].append(val)
print(d)
# convert dict.items() to your wanted format
format = [list(i) for i in d.items()]
print(format)
Вывод:
defaultdict(<class 'list'>, {'Product1': [1, -1, 0], 'Product2': [2, 4, -1]})
[['Product1', [1, -1, 0]], ['Product2', [2, 4, -1]]]
Использование defaultdict(list)
предпочтительнее, чем dict.setdefault(key,[])
, или использование try: except:
, или тестирование, если key in dict
, потому что оно в целом быстрее (встроенная оптимизация), чем любой из других методов.
Доку:
Вы также можете использовать itertools.groupby () , который работает с отсортированными данными (ваши сортируются ), чтобы получить те же результаты:
from itertools import groupby
grped = groupby( zip(products,values), lambda x:x[0]) # group by 1st value
l = []
for g in grped:
l.append([g[0],list(val for _,val in g[1])]) # extract 2nd value from grouping
print(l) # [['Product1', [1, -1, 0]], ['Product2', [2, 4, -1]]]
Использование groupby
в этом списке создает такое же разбиение, посколькуотсортировано - если бы оно не было отсортировано, вы получите другие результаты.