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

标签 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

即便如此,如果电话号码不存在,那么列表条目 [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/

相关文章:

python - 使用 skimage.transform.rotate 时如何为外部像素创建蒙版

javascript - 如何对具有相似键的数据进行分组?

c# - 比较 2 个列表后获取缺失值

python - 从列表末尾删除零

python - MongoDB 在 python 中没有返回结果

python - 通过 Mutagen 在 Python 中确定 MP3 位深度

python - 用numpy加速求解三角线性系统?

c - C 中的线程数组

mysql - Groovy - 连接两个 SQL Select 结果

Python redis rpop 是 resultng b'value' 列表结构