Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 25, 2018 13:10:29

ivant
Зарегистрирован: 2018-08-25
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

Добрый день, надеюсь на помощь специалистов.

есть 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

Отредактировано ivant (Авг. 25, 2018 13:31:01)

Офлайн

#2 Авг. 25, 2018 13:38:42

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

 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



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Авг. 25, 2018 13:39:04)

Офлайн

#3 Авг. 25, 2018 14:02:33

ivant
Зарегистрирован: 2018-08-25
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

Отлично! Большое спасибо!

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

Хорошего дня!

Офлайн

#4 Авг. 25, 2018 14:30:31

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

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

Только учти, если во время итерации что-то добавится в список, напрмер из другого потока, то велезет ошибка



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Авг. 25, 2018 14:32:04)

Офлайн

#5 Авг. 25, 2018 16:22:21

ivant
Зарегистрирован: 2018-08-25
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

 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.

Офлайн

#6 Авг. 25, 2018 23:15:02

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

Я не до конца понял, чего тебе надо. Ты хочешь, чтобы если SKU повторялся а model - нет, то я к SKU добавил model и добавил это к old?

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



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Авг. 25, 2018 23:17:16)

Офлайн

#7 Авг. 26, 2018 01:16:52

ivant
Зарегистрирован: 2018-08-25
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

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}]

Офлайн

#8 Авг. 27, 2018 09:59:15

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 325
Репутация: +  13  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

 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



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Отредактировано DamMercul (Авг. 27, 2018 09:59:58)

Офлайн

#9 Авг. 27, 2018 21:54:07

ivant
Зарегистрирован: 2018-08-25
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

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 (Авг. 27, 2018 22:00:39)

Офлайн

#10 Авг. 27, 2018 21:59:18

ivant
Зарегистрирован: 2018-08-25
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки с вложеннми словорями. Обработка

DamMercul
Принцип - если sku в old уже есть, он добавляется в extra, а там уже ели надо можешь extra переделать в ассоциативный массив, сам словарь сделай ключом а значением индкс в new
хотя возможно я принцип не понял. Надо подумать

Отредактировано ivant (Авг. 27, 2018 22:08:17)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version