2017-02-23 70 views
0

Я работаю в python для цели аутентификации. Мне нужно получить группы из LDAP. Ответ, который я получаю, представлен в виде списка. Но я нуждался в нем в форме словаря, где ключ должен иметь значение «cn» и значение «uid».Python Список словаря с ключевым значением

Как это сделать.

[ 
     [ 
      ('ou=mathematicians, 
      dc=example, 
      dc=com', 
      { 
       'objectClass': [ 
        'groupOfUniqueNames', 
        'top' 
       ], 
       'ou': [ 
        'mathematicians' 
       ], 
       'uniqueMember': [ 
        'uid=euclid, 
        dc=example, 
        dc=com', 
        'uid=riemann, 
        dc=example, 
        dc=com', 
        'uid=euler, 
        dc=example, 
        dc=com', 
        'uid=gauss, 
        dc=example, 
        dc=com', 
        'uid=test, 
        dc=example, 
        dc=com' 
       ], 
       'cn': [ 
        'Mathematicians' 
       ] 
      }) 
     ], 
     [ 
      ('ou=scientists, 
      dc=example, 
      dc=com', 
      { 
       'objectClass': [ 
        'groupOfUniqueNames', 
        'top' 
       ], 
       'ou': [ 
        'scientists' 
       ], 
       'uniqueMember': [ 
        'uid=einstein, 
        dc=example, 
        dc=com', 
        'uid=galieleo, 
        dc=example, 
        dc=com', 
        'uid=tesla, 
        dc=example, 
        dc=com', 
        'uid=newton, 
        dc=example, 
        dc=com' 
       ], 
       'cn': [ 
        'Scientists' 
       ] 
      }) 
     ] 
    ] 
+0

Не могли бы вы опубликовать, какой будет идеальный формат? –

+0

Dict: {Scientist = einstein, galieleo, tesla, newton} {Mathematicians = euclid, gauss, test} Ключ должен быть Cn, а значение должно быть UId. Это то, что ожидается –

ответ

0

Это выглядит довольно простой случай синтаксического анализа строк. Python довольно силен в этом отношении. Я бы рекомендовал посмотреть на re module для более предварительной обработки. В вашем случае, это выглядит как дело всего лишь итерация и flattening- так что-то вроде этого:

import re 

def flatten_LDAP(data): 
    response = {} 

    # Iterate through each item 
    for dirty_el in data: 

     # Manually flatten. Not robust, but good enough 
     cn = dirty_el[0][1]['cn'][0] 

     # Get users in list comprehension 
     users = [ 
      # Split user from the string 
      re.split(r'=|,',member)[1] 

      # Iterate from flattened 'uniqueMember' 
      for member in dirty_el[0][1]['uniqueMember'] 
     ] 

     # Add to dictionary 
     response[cn] = users 

    # Return 
    return response 

Если сделать трюк

Я уверен, что вы могли бы получить гораздо больше фантазии и процесс этот на потоковый уровень из LDAP, но я уверен, что этого будет достаточно.