我有 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
即便如此,如果电话号码不存在,那么列表条目 [1] 也不存在,所以现在我遇到了“超出范围”的错误。
帮助。
谢谢大家。
最佳答案
result[1].get('givenName', '')
这将返回一个列表(如果 'givenName'
是字典中的一个键,其值是一个列表)或一个空字符串(如果 'givenName'
是不是 key )。
然后您将对结果应用 [1]
。大概你的意思是 [0]
,但即便如此,空字符串的长度也为 0。你无法在其中查找索引 0 或索引 1。
你可以改为:
result[1].get('givenName', [''])[0]
现在在缺少 key 的情况下,您有一个包含空字符串的列表。因此,对其应用 [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:
关于Python通过包含列表的字典列表循环创建新字典的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692418/