Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 27, 2018 22:38:26

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

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

ivant
У меня все так) Все уникальные в old'е, повторяющиеся (с моделями) в extra



____________________________________________________

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

Офлайн

#2 Авг. 28, 2018 15:40:44

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

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

DamMercul
я конечно понимаю что надо учиться, но это явно выше моих умственных сил
Хорошо запутал код )

максимум к чему я пришел:

 from copy import deepcopy
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}]
old=[]
extra = []
for i in products:
	sku = i['sku']
	if not sku in old:
		old.append(sku)
		continue
	model_code = "".join(i['model'].split(" ")[1:])
	_new_i = deepcopy(sku)
	sku_new = sku + '-' + model_code
	extra.append(sku_new)
Но не понимаю.
1. Для чего делаем deepcopy?
2. получаю sku, но не могу получить все данные по товару. Вероятно надо пользоваться этим:
 new_items_asdict = {products[a]['sku']: a for a in range(products.__len__())}
3. Не понимаю смысл этого:
 old_items = [a for a in old][:]

Отредактировано ivant (Авг. 28, 2018 15:41:51)

Офлайн

#3 Авг. 28, 2018 18:20:11

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

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

ivant
DamMerculя конечно понимаю что надо учиться, но это явно выше моих умственных сил Хорошо запутал код )максимум к чему я пришел:
1. Если ты просто сделаешь например А = B, а станет ссылкой на B до тех пор пока А не изменишь. То есть ИД будет у них одинаковый и при изменении А изменится и B. deep_copy копирует контент и ты можешь что угодно с переменной делать
2. Проблем. Тут у тебя будет ошибка, индексация поднимет KeyError, надо иетрацию делать по ключам а не с нуля до длины словаря
3. То же самое, что и copy, только с листами можно сделать срез не срезая, ид изменится



____________________________________________________

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

Офлайн

#4 Авг. 28, 2018 22:41:33

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

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

Как-то так:

 import copy
import re
from itertools import groupby
from operator import itemgetter
from pprint import pprint
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}
]
def get_new_sku(old_sku, model, pattern):
    match = pattern.search(model)
    return f"{old_sku}-{match.group(1).lower()}" if match else old_sku
def get_unique_and_repeated_products(products):
    unique_products = []
    repeated_products = []
    pattern = re.compile(r'\d+\s\(([^,]+)')
    by_sku = itemgetter('sku')
    products_copy = sorted(copy.deepcopy(products), key=by_sku)
    for _, sku_group in groupby(products_copy, key=by_sku):
        unique, *repeated = sku_group
        unique_products.append(unique)
        if len(repeated) == 0:
            continue
        for item in repeated:
            item['sku'] = get_new_sku(item['sku'], item['model'], pattern)
        unique['grouped_sku'] = ', '.join(item['sku'] for item in repeated)
        repeated_products.extend(repeated)
    return unique_products, repeated_products
unique_products, repeated_products = get_unique_and_repeated_products(products)
pprint(unique_products)
pprint(repeated_products)

Отредактировано Stright (Авг. 28, 2018 22:49:06)

Офлайн

#5 Авг. 29, 2018 00:29:47

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

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

Stright и DamMercul
Благодарю Вас за помощь! Многое стало яснее во время разбора предложенного Вами кода!
Надеюсь в недалёком будущем и сам смогу помогать!

Всех благ Вам!
С уважением
ivant

Офлайн

#6 Авг. 29, 2018 09:39:46

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

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

Stright
Как-то так:
Форматирование это появилось только в python 3.6+, так что его пока не использовать



____________________________________________________

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

Офлайн

#7 Авг. 29, 2018 09:40:54

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

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

Спасибо, не буду

Офлайн

#8 Авг. 29, 2018 09:42:09

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

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

Stright
Спасибо, не буду
Агась, лучше .format() или с процентами. Скоро пеп выпустят, тогда и хоть заюзайся никто не наругает xDD



____________________________________________________

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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version