我有一个PHP背景,对python来说相当新,我正在创建一个帮助类,用于从ldap服务器返回一些ldap结果。
pythons 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
如果对于ldap中的条目不存在telephoneNumber,则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 :(得分: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: