Python通过包含列表的字典列表创建新字典循环的最佳方法

时间:2013-12-19 21:53:17

标签: python arrays list dictionary ldap

我有一个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]也不存在,所以现在我遇到了“超出范围”的错误。

帮助。

谢谢大家。

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: