Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 15, 2023 06:56:30

usmesn
Зарегистрирован: 2020-04-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Сорпоставление двух списков

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

 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']:
Т.е. нужно добавить значение ключа item_id словаря data_catalog в список list_structed_unit
 ['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел телемаркетинга', 'Сотрудник отдела', 1706113] 
['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Отдел дистанционных продаж юридическим лицам', 'Сотрудник отдела',1706115]  
['Департамент коммуникаций с клиентами', 'Контакт-центр Волжский', 'Контакт-центр Волжский', 'Начальник управления', 1706110]

Отредактировано usmesn (Ноя. 15, 2023 07:07:59)

Офлайн

#2 Ноя. 15, 2023 09:38:05

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2586
Репутация: +  60  -
Профиль   Отправить e-mail  

Сорпоставление двух списков

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

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

Но данный метод все же не самый удачный
Я бы таки смотрел в сторону получения валидных данных/ключей



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Ноя. 15, 2023 15:10:21

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1310
Репутация: +  113  -
Профиль   Отправить e-mail  

Сорпоставление двух списков

проверьте на больших данных

 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)

Офлайн

#4 Ноя. 15, 2023 17:08:00

usmesn
Зарегистрирован: 2020-04-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Сорпоставление двух списков

ZerG
Судя по задаче у вас явно какая-то проблема со структурой данных, либо же вы пытаетесь впихнуть невпихуемое.data_catalog и так уже содержит все необходимые вам данные, следовательно, логично было бы применть фильтр именно к этому обьекту и получить именно нужные вам наборы полей/значенийОднако предполагаю что данные списки вам выдает два совершенно разных приложения/api и задача таки свести ихТогда предложу что бы не бегать по словарю - преобразовать ключи словаря в нужный нам список и вывести в результате только те - что содержатся в list_structure_unit

привет, нет проблем соструктурой данных, все верно ты предположил, два разных сервиса генерят эти массивы данных, причем data_catalog - глобальный справочник по компании по всем структурным единицам. С этим словарем можно только сравнивать и получать из него данные нужные, в данном сучае это id этого структурного подражделения. После добовления его в список list_structure_unit далее эта информация будет передаваться другому сервису через api, где требуется этот id для выполнения задачи. Название отдела там в целом и не требуется, это сделано для удобства поиска как раз этого id. Что касается одного из значений списка например такого(подобных там много, это срез списка) так заводится руководство управления - здесь структура такая: департамент/управлени/отдел. По сути это руководство всех отделов в управлении, и то, что это значение пусто в словаре data_catalog(obj) не очень понятно почему.

Отредактировано usmesn (Ноя. 15, 2023 17:17:21)

Офлайн

#5 Ноя. 16, 2023 07:26:48

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2586
Репутация: +  60  -
Профиль   Отправить e-mail  

Сорпоставление двух списков

usmesn
Кстати да
Сравните оба варианта на больших обьемах данных и отпишите результаты обоих методов которые вам предложили
Интересно кто быстрее точнее обработает с вашей структурой



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#6 Ноя. 16, 2023 22:43:50

usmesn
Зарегистрирован: 2020-04-28
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Сорпоставление двух списков

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)

Офлайн

#7 Ноя. 17, 2023 13:05:06

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2586
Репутация: +  60  -
Профиль   Отправить e-mail  

Сорпоставление двух списков

https://tproger.ru/translations/implementing-zip-list-comprehensions
Дальше будет все понятно



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version