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

 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]
ZerG
Судя по задаче у вас явно какая-то проблема со структурой данных, либо же вы пытаетесь впихнуть невпихуемое.

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

Но данный метод все же не самый удачный
Я бы таки смотрел в сторону получения валидных данных/ключей
xam1816
проверьте на больших данных
 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)
usmesn
ZerG
Судя по задаче у вас явно какая-то проблема со структурой данных, либо же вы пытаетесь впихнуть невпихуемое.data_catalog и так уже содержит все необходимые вам данные, следовательно, логично было бы применть фильтр именно к этому обьекту и получить именно нужные вам наборы полей/значенийОднако предполагаю что данные списки вам выдает два совершенно разных приложения/api и задача таки свести ихТогда предложу что бы не бегать по словарю - преобразовать ключи словаря в нужный нам список и вывести в результате только те - что содержатся в list_structure_unit

привет, нет проблем соструктурой данных, все верно ты предположил, два разных сервиса генерят эти массивы данных, причем data_catalog - глобальный справочник по компании по всем структурным единицам. С этим словарем можно только сравнивать и получать из него данные нужные, в данном сучае это id этого структурного подражделения. После добовления его в список list_structure_unit далее эта информация будет передаваться другому сервису через api, где требуется этот id для выполнения задачи. Название отдела там в целом и не требуется, это сделано для удобства поиска как раз этого id. Что касается одного из значений списка например такого(подобных там много, это срез списка) так заводится руководство управления - здесь структура такая: департамент/управлени/отдел. По сути это руководство всех отделов в управлении, и то, что это значение пусто в словаре data_catalog(obj) не очень понятно почему.
ZerG
usmesn
Кстати да
Сравните оба варианта на больших обьемах данных и отпишите результаты обоих методов которые вам предложили
Интересно кто быстрее точнее обработает с вашей структурой
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)
ZerG
https://tproger.ru/translations/implementing-zip-list-comprehensions
Дальше будет все понятно
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