Найти - Пользователи
Полная версия: Списки с вложеннми словорями. Обработка
Начало » Python для новичков » Списки с вложеннми словорями. Обработка
1 2
ivant
Добрый день, надеюсь на помощь специалистов.

есть 2 списка с вложенными словорями:

 new = [{'sku': 'DS-AC-AANG9HA301', 'price': 145.16, 'qty': 4}, {'sku': 'DS-AC-AAN9L9HA332', 'price': 169.35, 'qty': 6}, {'sku': 'DS-AC-AAN9N9HA323', 'price': 174.34, 'qty': 0}, {'sku': 'DS-AC-AANG9HA304', 'price': 145.16, 'qty': 4}, {'sku': 'DS-AC-AAN9L9HA335', 'price': 169.35, 'qty': 6}]
old = [{'sku': 'DS-AC-AANG9HA301', 'price': 145.16, 'qty': 0}, {'sku': 'DS-AC-AAN9L9HA332', 'price': 169.35, 'qty': 0}, {'sku': 'DS-AC-AAN9N9HA32', 'price': 174.34, 'qty': 0}, {'sku': 'DS-AC-AANG9HA303', 'price': 145.16, 'qty': 0}, {'sku': 'DS-AC-AAN9L9HA334', 'price': 169.35, 'qty': 0}]
Задача:
1. собрать в новом списке/словаре все товары из new
2. Нужно сравнить 2 списка, если в new нет товара из old то добавить товар из old в новый список из 1 пункта (сравнивание по sku)

Заранее благодарю за любую помощь!

PS: Python3
DamMercul
 new_items = [(a['sku'], new.index(a)) for a in new]
old_items = [a['sku'] for a in old]
for i in new_items:
    if not i[0] in old_items:
        old.append(new[i[1]])
        continue
ivant
Отлично! Большое спасибо!

PS. только нужно было наоборот сделать но я поправил!

Хорошего дня!
DamMercul
ivant
Отлично! Большое спасибо! PS. только нужно было наоборот сделать но я поправил! Хорошего дня!
Незачто

Только учти, если во время итерации что-то добавится в список, напрмер из другого потока, то велезет ошибка
ivant
 products = [
		{'sku': 'DS-AC-AANG9HA301', 'model': '1 (E82/87, 2004-2011)', 'qty': 4},
		{'sku': 'DS-AC-AAN9L9HA332', 'model': '2 (1C, F22, 2014-)', 'qty': 6}, 
		{'sku': 'DS-AC-AAN9N9HA32', 'model': '3 (1C, F22, 2014-)', 'qty': 10}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '4 (1C, F22, 2014-)', 'qty': 4},
		{'sku': 'DS-AC-AANG9HA304', 'model': '1 (1K4, F20, 2011-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '2 (2C, F22, 2014-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '1 (4C, F22, 2014-)', 'qty': 4}, 
		{'sku': 'DS-AC-AAN9L9HA334', 'model': '1 (E82/87, 2004-2011)', 'qty': 6}]
DamMercul, возможно и тут подскажеш?

В списке есть повторяющиеся SKU но отличаются значением в переменной model.
Нужно первое (уникальное значение sku) поместить в один список, а все повторы в другой и сделать SKU уникальным (возможно добавить к SKU значение переменной из model). А так же добавить к оригиналу новую переменную с перечислением (через запятую) повторяющихся SKU (уже с добавленными model) ?!

На выходе должно быть 2 списка с оригинальными SKU (и доп переменной со списком модифицированых SKU) и второй список с повторами к которым добавлен model.
DamMercul
Я не до конца понял, чего тебе надо. Ты хочешь, чтобы если SKU повторялся а model - нет, то я к SKU добавил model и добавил это к old?

UPD: Я сейчас сонный, завтра помогу, а ты пока напиши по-понятнее, что ты хочешь) А сделать я помогу завтра или пусть кто-то еще поможет
ivant
DamMercul
надо что бы в итоге было 2 списка, примерно такого вида:

 products1 = [
		{'sku': 'DS-AC-AANG9HA301', 'model': '1 (E82/87, 2004-2011)', 'qty': 4},
		{'sku': 'DS-AC-AAN9L9HA332', 'model': '2 (1C, F22, 2014-)', 'qty': 6}, 
		{'sku': 'DS-AC-AAN9N9HA32', 'model': '3 (1C, F22, 2014-)', 'qty': 10}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '4 (1C, F22, 2014-)', 'qty': 4,'grouped_sku':'DS-AC-AANG9HA304-1k4, DS-AC-AANG9HA304-2c, DS-AC-AANG9HA304-4c'},
		{'sku': 'DS-AC-AAN9L9HA334', 'model': '1 (E82/87, 2004-2011)', 'qty': 6}]
products2 = [
                {'sku': 'DS-AC-AANG9HA304-1k4', 'model': '1 (1K4, F20, 2011-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304-2c', 'model': '2 (2C, F22, 2014-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304-4c', 'model': '1 (4C, F22, 2014-)', 'qty': 4}]

DamMercul
 from copy import deep_copy
new_items_asdict = {new[a]['sku']: a for a in range(new.__len__())}
old_items = [a for a in old][:]
extra = []
for i in old_items:
    sku = i['sku']
    if not sku in new_items_asdict:
        old.append(i)
        continue
    model_code = "".join(i['model'].split(" ")[1:])
    _new_i = deep_copy(sku)
    _new_i['sku'] = sku + "-" + model_code
    extra.append(_new_i)
Код грязный, не проверял, работает ли) Проверь, должен. Если синтаксис неправильный - исправь если скобка неправильно стоит и тд. Принцип - если sku в old уже есть, он добавляется в extra, а там уже ели надо можешь extra переделать в ассоциативный массив, сам словарь сделай ключом а значением индкс в new
ivant
DamMercul
В этом виде не работает
Этот код не ту задачу выполняет. Надо что бы из этого
 products = [
		{'sku': 'DS-AC-AANG9HA301', 'model': '1 (E82/87, 2004-2011)', 'qty': 4},
		{'sku': 'DS-AC-AAN9L9HA332', 'model': '2 (1C, F22, 2014-)', 'qty': 6}, 
		{'sku': 'DS-AC-AAN9N9HA32', 'model': '3 (1C, F22, 2014-)', 'qty': 10}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '4 (1C, F22, 2014-)', 'qty': 4},
		{'sku': 'DS-AC-AANG9HA304', 'model': '1 (1K4, F20, 2011-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '2 (2C, F22, 2014-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '1 (4C, F22, 2014-)', 'qty': 4}, 
		{'sku': 'DS-AC-AAN9L9HA334', 'model': '1 (E82/87, 2004-2011)', 'qty': 6}]

превратить вот в это
 products1 = [
		{'sku': 'DS-AC-AANG9HA301', 'model': '1 (E82/87, 2004-2011)', 'qty': 4},
		{'sku': 'DS-AC-AAN9L9HA332', 'model': '2 (1C, F22, 2014-)', 'qty': 6}, 
		{'sku': 'DS-AC-AAN9N9HA32', 'model': '3 (1C, F22, 2014-)', 'qty': 10}, 
		{'sku': 'DS-AC-AANG9HA304', 'model': '4 (1C, F22, 2014-)', 'qty': 4,'grouped_sku':'DS-AC-AANG9HA304-1k4, DS-AC-AANG9HA304-2c, DS-AC-AANG9HA304-4c'},
		{'sku': 'DS-AC-AAN9L9HA334', 'model': '1 (E82/87, 2004-2011)', 'qty': 6}]
products2 = [
                {'sku': 'DS-AC-AANG9HA304-1k4', 'model': '1 (1K4, F20, 2011-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304-2c', 'model': '2 (2C, F22, 2014-)', 'qty': 4}, 
		{'sku': 'DS-AC-AANG9HA304-4c', 'model': '1 (4C, F22, 2014-)', 'qty': 4}]

тоесть,
1. дубликаты SKU в новом листе (products2) с уникальными sku.
2. Все уникальные SKU, в листе Products1. Но в товар DS-AC-AANG9HA304 добавлен новый ключ с перечислением дублей из products2 (так как они дубли этого sku)
вот такая вот задачка
ivant
DamMercul
Принцип - если sku в old уже есть, он добавляется в extra, а там уже ели надо можешь extra переделать в ассоциативный массив, сам словарь сделай ключом а значением индкс в new
хотя возможно я принцип не понял. Надо подумать
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB