LDAP Python 查询及字典转换

1 投票
1 回答
1863 浏览
提问于 2025-04-16 23:59

抱歉,我想不出一个更好的问题标题。

我刚开始学习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]

当你只是对数据中的“叶子”元素进行操作时,嵌套这么多列表推导式并不是太糟糕,但如果你试图在每个层级都操作数据结构,那就会变得非常复杂。请参考我开头的评论。

撰写回答