Как в файл добавить уникальные значения?

Имеется файл в котором такой список строк: введите сюда описание изображения

Порядок столбцов такой: артикул,имя,бренд,кол-во,цена

Нужно считать кол-во одинаковых строк, то есть чтобы совпдали артикул, бренд и цена. Считаем кол-во таких одинаковых строк и записываем в файл. Должно получится так:

109120466 Кольцо уплотнительное (18x6x4) TOPRAN 8 8.50

То есть из восьми одинаковых строк остается одна и кол-во этих строк пишется в столбик для кол-во

Я сделал так:

wbf = Workbook()
ws = wbf.active

list_items = get_list_data(file_input)
articul = ''
for i,item in enumerate(list_items):
    count_item = 0
    window['out'].Update(value=f'{i}/{len(list_items)}')
    for j,item_j in enumerate(list_items):
        if  item['idnp'] == item_j['idnp'] and item['brand'] == item_j['brand'] and item['price'] == item_j['price']:
            count_item += 1
    if count_item != 0:
        if articul != item['idnp']:
            ws.append([item['idnp'],item['title'],item['brand'],count_item,item['price']])
            articul = item['idnp']

В list_items приходит список строк из файла. Далее циклы, в которых проходят проверки. Проверяется каждый элемент списка с тем же элементом списка, так я считаю одинаковые строки. Далее я взял переменную articul, пока что она пустая, и сверяю ее с текущим элементов списка. Это делаю для того чтобы не было дублей в файле. Но как я понял это плохой подход, потому что если изменить цену у такого же артикула(типа id товара) то она в файл не добавится. И это нужно исправить.

Как это сделать? Может есть вообще другой подход, чтоб провернуть такое?

Но если изменить цену у какой-то из строк, то она не добавится в файл.


Ответы (1 шт):

Автор решения: Andrey Maslov

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

wbf = Workbook()
ws = wbf.active

list_items = get_list_data(file_input)
result_list = []
for i,item in enumerate(list_items):
    window['out'].Update(value=f'{i}/{len(list_items)}')
    is_duplicate = False
    for item_check in result_list:
        if  item['idnp'] == item_check['idnp'] and item['brand'] == item_check['brand'] and item['price'] == item_check['price']:
            is_duplicate = True
            item["duplicates_count"] = item["duplicates_count"] + 1
            break;
    if not is_duplicate:
       result_list.append(item)
       result_list[-1]["duplicates_count"] = 1

for item in result_list:
   ws.append([item['idnp'], item['title'], item['brand'], item["duplicates_count"], item['price']])
            
→ Ссылка