2014-11-07 2 views
0

Извините заранее, если этот вопрос уже задан, проделали какой-то поиск, но не повезло.Извлечь строку из кортежа, встроенного в список, Python 3

TL; DR: Попытка вытащить вторую часть кортежа из строя.

Я создаю скрипт с python3, который извлекает информацию из LDAP и возвращает то, что, как мы надеемся, применимо к данным.

def GetMembersWDept(): 
    i2 = input('Please input the department number. Examples: 2410, 2417\n') 
    criteria = '(&(objectClass=User)(department=' + i2 + '*))' 
    print ('Search criteria set to: \t\t' + criteria) 
    searchDC = 'dc=example,dc=com' 
    print ('Searching location: \t\t\t' + searchDC) 
    print() 
    out = [] 
    result = c.search(searchDC, criteria, \ 
     SEARCH_SCOPE_WHOLE_SUBTREE, attributes = ['department']) \ 
     # request a few object from the ldap server 
    if result: 
     for r in c.response: 
      if (r['type'] == 'searchResEntry'): 
       out.append(r['dn']) 
       out.append(r['attributes']) # comes out in tuple form 
      else: 
       pass 
    else: 
     print('result', conn.result) 
    return out 

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

Выход образца: критерии

Поиск устанавливается: (& (объектный = User) (отдел = 2417 *)) Поиск местоположения: dc = PLE, DC = COM

['CN=First Last,OU=ex,OU=am,DC=ple,DC=com', {'department': ['1234']}, 'CN=Another Person,OU=ex,OU=am,DC=ple,DC=com', {'department': ['1234']}]

Как я могу вытащить вторую часть кортежа, т. Е. «1234», вместо строки? Эндшпиль здесь будет форматировать данные, как:

[First Last, 1234, Another Person, 1234]

... так что я могу использовать его в другую функцию, которая сравнивает отдел и возвращает имя, если условия не будут выполнены.

ответ

2

Если выход:

['CN=First Last,OU=ex,OU=am,DC=ple,DC=com', {'department': ['1234']}, 'CN=Another Person,OU=ex,OU=am,DC=ple,DC=com', {'department': ['1234']}] 

, то вы можете установить, что равно newresult и сделать:

print(list(newresult[1].values())[0][0]) 

Это предполагает, что элемент в списке с отделом всегда находится в положении 1, что словарь всегда имеет 1 значение для него и что нужный номер отдела является единственным элементом в списке.

+0

Это работает и возвращает 1234, как указано выше. Если люди были из разных отделов (скажем, 1234, 2345), есть ли способ применить этот метод для вытащить оба или любое количество отделов? Я надеялся отобразить DN, отдел, DN, отдел и т. Д., Не опуская повторений ... Кроме того, спасибо за быстрый и точный ответ! :) – oBreak

+0

Да, вы бы исключили последний '[0]', чтобы он читал 'print (list (newresult [1] .values ​​()) [0])', который дает вам список отделов – AtAFork

+0

вопрос неправильный, это будет просто 'print (list (newresult [3] .values ​​()) [0] [0])' – AtAFork

0

IMHO, было бы проще использовать c.search_s вместо c.search, если у вас нет веских причин для этого (или вы должны показать, как вы создаете свой ответ).

От питон-Ldap документации: search_s непосредственно возвращает список 2-кортежа (дп, AttrS), где дп является строка, содержащая DN (различающееся имя) от входа, и ATTRS представляет собой словарь, содержащий атрибуты, связанные с записью. Ключи ATTRS являются строками, и соответствующие значения представляют собой списки строк

Таким образом, для каждого кортежа entry вас есть:

dn = entry[0] 
departement = entry[1]{'department'}[0] 
+0

Я не говорю, что предлагаемая не будет предпочтительнее, но для тех, кто ссылается на этот ответ, я еще не смог заставить его работать. Он возвращает: Файл «ADQueryViaScript.py», строка 175, в GetMembersWDept result = c.search_s (searchDC, критерии, \ AttributeError: объект «Connection» не имеет атрибута «search_s» – oBreak

+0

Кроме того, это python3-ldap, который isn это точно один-к-одному матч с более развитым и лучше документированным python-ldap из того, что я смог определить. – oBreak

+0

Спасибо, что нашли время ответить. – oBreak

Смежные вопросы