Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2025 12:32:36

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

Списки словарей

Приветствую.
Есть есть два списка словарей следующего плана:
список пользователей и групп у него(инфа из АД)
list_users_group=[{'login': ‘login1’, ‘group’: ‘back’},
{'login': ‘login1’, ‘group’: ‘radius-profile’},
{'login': ‘login1’, ‘group’: ‘dlp_exchange’},
{'login': ‘login1’, ‘group’: ‘list-users’},
{'login': ‘login1’, ‘group’: ‘ВОР’},
{'login': ‘login1’, ‘group’: ‘minerva’},
{'login': ‘login1’, ‘group’: ‘proxy’},
{'login': ‘login2’, ‘group’: ‘gl-min’},
{'login': ‘login2’, ‘group’: ‘hq-mail’},
{'login': ‘login2’, ‘group’: ‘hq-mailbox’},
{'login': ‘login2’, ‘group’: ‘MarsSB’},
{'login': ‘login2’, ‘group’: ‘MarsSBS’},
{'login': ‘login3’, ‘group’: ‘exch-notif’},
{'login': ‘login3’, ‘group’: ‘teams-users’},
{'login': ‘login3’, ‘group’: ‘users’},
{'login': ‘login3’, ‘group’: ‘DATA_MARSSB_UR’}]

и список всех групп АД(укороченная версия) c их описание

list_group=[{'group': ‘MarsSBS’, ‘description’: ‘description1’},
{'group': ‘minerva’, ‘description’: ‘description2’},
{'group': ‘teams-users’, ‘description’: ‘description3’},
{'group': ‘mailbox’, ‘description’: ‘description4’},
{'group': ‘users’, ‘description’: ‘description5’},
{'group': ‘proxy’, ‘description’: ‘description6’},
{'group': ‘test’, ‘description’: ‘description7’}]

Есть задача добавить в список пользователей описание групп только тех которые есть у него из общего списка групп.
Есть вот такое решение

 res_user_group_description=[]
for i,v in enumerate(list_users_group):
    for j,k in enumerate(list_group):
        if v['group']==k['group']:
            res_user_group_description.append({'login':v['login'], 'group':v['group'], 'description':k['description']})
print(res_user_group_description)
но оно не оптимально т.к:
всего записей о пользователях и группах указанного плана более 1 200 000
всего записе по группам и их описанию около 41 000.

может есть какие-то идеи как это реализовать c с указанным объемом данных(я ждал около 5 минут и скрипт так и незавершился)

Отредактировано usmesn (Фев. 11, 2025 12:44:22)

Офлайн

#2 Фев. 11, 2025 16:45:12

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2761
Репутация: +  185  -
Профиль   Отправить e-mail  

Списки словарей

> всего записей о пользователях и группах указанного плана более 1 200 000
> всего записе по группам и их описанию около 41 000.

Где и в каком виде эти записи хранятся?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Фев. 11, 2025 19:50:46

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

Списки словарей

Rodegast
всего записей о пользователях и группах указанного плана более 1 200 000
> всего записе по группам и их описанию около 41 000.
привет, это информация из корпоративного домена, active directory(AD) по активныйм учетным записям, те которые включенные, в компании более 40 000 пользователей.
первый запрос к AD:
выгружаем инфу по пользователям с атрибутами samaccountname и member, member иметт тип list и все это пакуется в список словарей т.е
[{'user1': },
{'user2': },
……………………………………………………………….
{'user_n': }].
далее для удобства обогащения описанием группы(второй запрос к ad) привожу к формату(добавляю ключи login и group)
['{login': ‘user1’: ‘group’: ‘group1’, ‘login’: ‘user1’: ‘group’: ‘group2’, ‘login’: ‘user1’: ‘group’: ‘group_n’},
‘{login’: ‘user2’: ‘group’: ‘group1’, ‘login’: ‘user2’: ‘group’: ‘group2’, ‘login’: ‘user2’: ‘group’: ‘group_n’,
…………………………………………………..
'{login': ‘user_n’: ‘group’: ‘group1’, ‘login’: ‘user_n’: ‘group’: ‘group2’, ‘login’: ‘user_’: ‘group’: ‘group_n’}}

второй запрос к AD:
выгружаем все группы безопасности и группы рассылок, атрибуты ad samaccountname и description, description в данном случае имет тип строка т.к. описание у группы одно(в отличие от членства в группах), например группа доступа к файловой папке x c правами rw.
Так же далеее привожу к формату
['{group': ‘name_group1’}, {'group': ‘name_group2’}, {'group': ‘name_group3’},……….. {'group': ‘name_group_’n}
И потом собственно обогащаю информацие “описанием для чего эта группа предназначена” на основании ее наличия у пользователя. Т.е. второй запрос это список всех групп в домене и их описание.
Неожидал что так много будет щзаписей по пользователям более 1 200 000 т.к групп у него может быть до 20-30 и пользователей в домене более 40 000(только включенных учеток).
И исходя из
 res_user_group_description=[]
for i,v in enumerate(list_users_group):
    for j,k in enumerate(list_group):
        if v['group']==k['group']:
            res_user_group_description.append({'login':v['login'], 'group':v['group'], 'description':k['description']})
print(res_user_group_description)
один и тотже пользователь прогоняется по всем гурппам(40 000 записей) примерно 25 раз, что не есть хорошо)

В один запрос в плане к ad этого скорее невозможно сделать(ну или я незнаю как это сделать, не знаком с powershellом), т.к. это разные объекты поиска - пользователи и группы.

Отредактировано usmesn (Фев. 11, 2025 19:58:29)

Офлайн

#4 Фев. 11, 2025 21:38:35

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2761
Репутация: +  185  -
Профиль   Отправить e-mail  

Списки словарей

Я бы создал Sqlite базу с 2 таблицами, загрузил бы туда пользователей и группы, а потом просто от туда выбрал бы то что нужно.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Фев. 11, 2025 23:19:32)

Офлайн

#5 Фев. 11, 2025 22:17:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9892
Репутация: +  854  -
Профиль   Отправить e-mail  

Списки словарей

usmesn
может есть какие-то идеи как это реализовать c с указанным объемом данных(я ждал около 5 минут и скрипт так и незавершился)
В питоне есть модуль в стандартной библиотеке для работы с SQLite. В этом модуле можно SQLite-базы строить прямо в оперативной памяти, без сохранения на диск. Так что построй в памяти пару отношений из исходных данных, а потом выполни по ним поиск с помощью SQL-запроса и результат поиска сохрани в словарь вывода. Для SQLite твои данные считаются микроскопическими, поэтому поиск пройдёт быстро.

Также такие вещи делают в pandas, но для этого сначала нужно поставить pandas, после этого надо прочитать кучу документации по pandas, потому что там всё неинтуитивное и без документации не разберёшься, как им пользоваться вообще. В общем, pandas не надо, не ставь.

Есть SQLite, он встроенный и эта СУБД вообще полезна сама по себе для работы с данными, даже браузеры обычные внутри себя все данные в SQLite хранят. С этим просто удобно работать.



Отредактировано py.user.next (Фев. 11, 2025 22:24:23)

Офлайн

#6 Фев. 12, 2025 08:03:54

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

Списки словарей

Rodegast, py.user.next , благодарю за идеи, буду реализовывать.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version