LDAP Python 查询及字典转换
抱歉,我想不出一个更好的问题标题。
我刚开始学习Python,正在努力掌握它的用法。现在我遇到的问题是,想找个简单的方法来减少从Python查询中得到的结果。
如果我理解没错,LDAP查询返回的是一个包含多个字典的列表,而这些字典里的值又是列表。这东西看起来复杂得很,我想应该有个简单的Python方法,把它转换成一个字典的列表,字典里的值就变成简单的字符串。
目前,我的代码只是简单地获取了字典的列表,但字典里的值还是列表。
for item in data:
results.append(item[1])
我还是个初学者,所以接下来该怎么做我也不太明白。我还在用Django,不知道这对理解我的困境有没有帮助。
编辑(添加数据示例):
结构大概是这样的:
data[index][1] = {'uid': ['restest'], 'mail': [''], 'givenName': ['Research'], 'cn': ['Research Test Account'], 'sn': ['Account']}
我希望把 'givenName': ['Research']
改成 'givenName': 'Research'
1 个回答
0
哈哈,我不太确定你是否真的想要这么复杂的数据结构。建议你考虑重构一下你的代码,让数据结构更容易理解。可以看看:面向对象编程、类和函数式编程的原则。
如果你只是想处理一个单独的字典,这里是答案:
data = {k:v[0] for (k,v) in data.items()}
下面是实际操作的例子:
>>> data = {'uid': ['restest'], 'mail': [''], 'givenName': ['Research'], 'cn': ['Research Test Account'], 'sn': ['Account']}
>>> data
{'mail': [''], 'sn': ['Account'], 'givenName': ['Research'], 'uid': ['restest'], 'cn': ['Research Test Account']}
>>> data = {k:v[0] for (k,v) in data.items()}
>>> data
{'mail': '', 'givenName': 'Research', 'cn': 'Research Test Account', 'sn': 'Account', 'uid': 'restest'}
你所做的就是把字典重新映射到每个列表的第一个项目。如果你想遍历你结构中的所有层级并进行这样的操作,只需把上面的代码放在一些列表推导式里面:
[[[{k:v[0] for (k,v) in change_dict.items()} for change_dict in list_of_dicts]
for list_of_dicts in list_of_lists]
for list_of_lists in mydata]
当你只是对数据中的“叶子”元素进行操作时,嵌套这么多列表推导式并不是太糟糕,但如果你试图在每个层级都操作数据结构,那就会变得非常复杂。请参考我开头的评论。