2013-12-19 83 views
1

我有一个PHP背景,是相当新的python,我创建了一个辅助类,用于返回一个ldap服务器的结果。Python最好的方式来创建新的字典循环遍历包含列表的字典列表

从蟒蛇LDAP库标准的结果:ldap.search_s()里面里面,即列表元组的使用词典列表:

[('uid', {'cn': ['cnvalue']}), ('uid2', {'cn': ['cnvalue2']})] 

我想这个转换成字典或一个简单的列表在PHP中讲一组关联数组。

对于我的生活,我无法弄清楚如何做到这一点。

这是多么我已经尝试过:

output = []   
for i, result in enumerate(results):    
    d = { 
     'firstname': result[1].['givenName'][1], 
     'phone': result[1].['telephoneNumber'][1] 
    } 
    output.append(d) 
return output 

如果telephoneNumber不存在LDAP中的条目Python库不填充该键,所以有些时候我也陷入了无效键例外,因此我修改如下。

output = []   
for i, result in enumerate(results):    
    d = { 
     'firstname': result[1].get('givenName', '')[1], 
     'phone': result[1].get('telephoneNumber' ,'')[1] 
    } 
    output.append(d) 
return output 

即便如此,如果telephoneNumber不存在,那么同样没有列表条目[1],所以现在我遇到了“超出范围”的错误。

帮助。

谢谢大家。

+0

请注意,列表从'0'开始,而不是从'1'开始 – alko

+0

givenName核心如何响应'cn'和'cnvalue'? – alko

+1

这将是一个好主意,以您将使用的格式发布一些名称和电话号码的数据。目前还不清楚你的内含字典的元组列表是如何与你的问题相关的。 – mrKelley

回答

4
result[1].get('givenName', '') 

这将返回一个列表(如果'givenName'是它的值是一个列表的字典中的键)或空字符串(如果'givenName'不是一个键)。

然后,您将应用[1]结果。假设你的意思是[0],但即使如此,一个空字符串的长度为0.你不能在其中查找索引0或索引1。

你可以做,而不是:

result[1].get('givenName', [''])[0] 

现在在密钥丢失,你的情况有一个包含一个空字符串列表。因此,将[0]应用于它会为您提供一个空字符串。

一种选择(不对付列表为空,但我不知道是否曾经发生在你处理数据):

def getfirst(attrs, key): 
    list_or_none = attrs.get(key) 
    return '' if list_or_none is None else list_or_none[0] 

然后:

d = { 
    'firstname': getfirst(result[1], 'givenName'), 
} 

顺便说一句,你使用enumerate,但从未实际提到i。所以你可以写for result in results:

+1

@alko:这是一本字典。在这个例子中它的占位符是'{'cn':['cnvalue']}',但提问者正在查找'givenName'和'telephoneNumber'而不是'cn'。所以我认为'cn'既可以作为实际密钥的一个例子,也可以是一个占位符,这些密钥可能存在或不存在于给定的LDAP记录中。 –

+0

http://www.python-ldap.org/doc/html/ldap.html说,“每个结果元组的形式是(dn,attrs),其中dn是一个字符串,其中包含DN(专有名称)条目,attrs是包含与条目相关的属性的字典,attrs的键是字符串,相关的值是字符串列表。 –

+0

ZOMG!史蒂夫说,这是一个快速的答复,正是我所期待的。 谢谢! – Rel