Форум сайта python.su
Всем привет.
Подскажите, как реализовать следующее: имеется список, у которого сами элементы явлюятся списком, также есть словарь у которого значение одного из ключей(их всего два) является списком часть элементов которого имееются в первом списке. Необходимо сопоставить эти списки и добавить(в конец словаря, на самом деле это неважно куда) значение ключа словаря в исходный словарь. На примере нагляднее будет:
list_structed_unit = [['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел телемаркетинга', 'Сотрудник отдела'], ['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел дистанционных продаж юридическим лицам', 'Сотрудник отдела'], ['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Контакт-центр Волжский', 'Начальник управления']] data_catalog = { "catalog_id": 1591, "items": [{ "item_id": 1706110, "values": ["04839", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "", "", "", "Начальник управления", "60727", "", "", "", ""] }, { "item_id": 1706111, "values": ["04840", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "", "", "", "Сотрудник управления", "60492", "", "55538", "", ""] }, { "item_id": 1706112, "values": ["04841", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел телемаркетинга", "", "", "Начальник отдела", "60492", "", "55538", "", ""] }, { "item_id": 1706113, "values": ["04842", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел телемаркетинга", "", "", "Сотрудник отдела", "142009", "", "", "", ""] }, { "item_id": 1706114, "values": ["04843", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел дистанционных продаж юридическим лицам", "", "", "Начальник отдела", "60492", "", "55538", "", ""] }, { "item_id": 1706115, "values": ["04844", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел дистанционных продаж юридическим лицам", "", "", "Сотрудник отдела", "142008", "", "", "", ""] }, { "item_id": 1706116, "values": ["04845", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел виртуальных продаж", "", "", "Начальник отдела", "60492", "", "55538", "", ""] }, { "item_id": 1706117, "values": ["04846", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел виртуальных продаж", "", "", "Сотрудник отдела", "142007", "", "55538", "", ""] }, { "item_id": 1706118, "values": ["04847", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел дистанционного обслуживания физических лиц", "", "", "Начальник отдела", "60492", "", "55538", "", ""] }, { "item_id": 1706119, "values": ["04848", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел дистанционного обслуживания физических лиц", "", "", "Сотрудник отдела", "142010", "", "", "", ""] }, { "item_id": 1706120, "values": ["04849", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел дистанционного обслуживания юридических лиц", "", "", "Начальник отдела", "60492", "", "55538", "", ""] }, { "item_id": 1706121, "values": ["04850", "ГОЛОВНОЙ БАНК", "Департамент коммуникаций с клиентами", "Контакт-центр Волжский", "Отдел дистанционного обслуживания юридических лиц", "", "", "Сотрудник отдела", "142011", "", "", "", ""] } ] } for unit in list_structed_unit: for v in data_catalog['items']:
['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел телемаркетинга', 'Сотрудник отдела', 1706113] ['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел дистанционных продаж юридическим лицам', 'Сотрудник отдела',1706115] ['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Контакт-центр Волжский', 'Начальник управления', 1706110]
Отредактировано usmesn (Ноя. 15, 2023 07:07:59)
Офлайн
Судя по задаче у вас явно какая-то проблема со структурой данных, либо же вы пытаетесь впихнуть невпихуемое.
data_catalog и так уже содержит все необходимые вам данные, следовательно, логично было бы применть фильтр именно к этому обьекту и получить именно нужные вам наборы полей/значений
Однако предполагаю что данные списки вам выдает два совершенно разных приложения/api и задача таки свести их
Тогда предложу что бы не бегать по словарю - преобразовать ключи словаря в нужный нам список и вывести в результате только те - что содержатся в list_structure_unit
# Заполним список из словаря выбрав нужные поля d_list = [] data = data_catalog["items"] for obj in data: dep = obj["values"][2] centr = obj["values"][3] otdel = obj["values"][4] or centr # В вашем примере если отдел не указан почему-то дублируется центр так что укажем его для исключения user = obj["values"][7] d_list.append([dep, centr, otdel, user, obj["item_id"]]) # Сравним два списка - вынесем в функцию для удобства def is_partial_match(item1, item2): for part1, part2 in zip(item1, item2): if part1 and part1 != part2: return False return True # Собственно заполним список валидными данными filtered_d_list = [item for item in d_list if any(is_partial_match(item, structure) for structure in list_structed_unit)] print(filtered_d_list)
filtered_d_list: [['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Контакт-центр Волжский', 'Начальник управления', 1706110], ['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел телемаркетинга', 'Сотрудник отдела', 1706113], ['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел дистанционных продаж юридическим лицам', 'Сотрудник отдела', 1706115]]
Офлайн
проверьте на больших данных
def compare_list(list_1, list_2): set_1 = set(list_1) if set_1 & set(list_2) == set_1: return True def add_item_id(add_to_list, from_data): out = [] for data in from_data['items']: for l in add_to_list: if compare_list(l, data['values']): out.append(l + [data['item_id']]) return out result = add_item_id(list_structed_unit, data_catalog) print(result)
Офлайн
ZerG
Судя по задаче у вас явно какая-то проблема со структурой данных, либо же вы пытаетесь впихнуть невпихуемое.data_catalog и так уже содержит все необходимые вам данные, следовательно, логично было бы применть фильтр именно к этому обьекту и получить именно нужные вам наборы полей/значенийОднако предполагаю что данные списки вам выдает два совершенно разных приложения/api и задача таки свести ихТогда предложу что бы не бегать по словарю - преобразовать ключи словаря в нужный нам список и вывести в результате только те - что содержатся в list_structure_unit
Отредактировано usmesn (Ноя. 15, 2023 17:17:21)
Офлайн
usmesn
Кстати да
Сравните оба варианта на больших обьемах данных и отпишите результаты обоих методов которые вам предложили
Интересно кто быстрее точнее обработает с вашей структурой
Офлайн
ZerG
функционал выполняется, пока попробывал только на указанном выше словаре, но поясните пожалуйста, что значат конструкции True/False в функции is_partial_match, да и вообще в целом не особо понимаю как работает вот это кусок
def is_partial_match(item1, item2): for part1, part2 in zip(item1, item2): if part1 and part1 != part2: return False return True # Собственно заполним список валидными данными filtered_d_list = [item for item in d_list if any(is_partial_match(item, structure) for structure in list_structed_unit)] print(filtered_d_list)
Отредактировано usmesn (Ноя. 16, 2023 22:46:07)
Офлайн
https://tproger.ru/translations/implementing-zip-list-comprehensions
Дальше будет все понятно
Офлайн