具有键值的Python列表到字典

时间:2017-02-23 05:38:28

标签: python-2.7 dictionary

我正在使用python进行身份验证。我需要从LDAP中检索组。我得到的回应是List的形式。但是我需要它以Dictionary的形式,其中Key应该是“cn”值,Value应该是“uid”。

怎么做。

 [
        [
            ('ou=mathematicians,
            dc=example,
            dc=com',
            {
                'objectClass': [
                    'groupOfUniqueNames',
                    'top'
                ],
                'ou': [
                    'mathematicians'
                ],
                'uniqueMember': [
                    'uid=euclid,
                    dc=example,
                    dc=com',
                    'uid=riemann,
                    dc=example,
                    dc=com',
                    'uid=euler,
                    dc=example,
                    dc=com',
                    'uid=gauss,
                    dc=example,
                    dc=com',
                    'uid=test,
                    dc=example,
                    dc=com'
                ],
                'cn': [
                    'Mathematicians'
                ]
            })
        ],
        [
            ('ou=scientists,
            dc=example,
            dc=com',
            {
                'objectClass': [
                    'groupOfUniqueNames',
                    'top'
                ],
                'ou': [
                    'scientists'
                ],
                'uniqueMember': [
                    'uid=einstein,
                    dc=example,
                    dc=com',
                    'uid=galieleo,
                    dc=example,
                    dc=com',
                    'uid=tesla,
                    dc=example,
                    dc=com',
                    'uid=newton,
                    dc=example,
                    dc=com'
                ],
                'cn': [
                    'Scientists'
                ]
            })
        ]
    ]

1 个答案:

答案 0 :(得分:0)

这看起来像一个非常简单的字符串解析案例。在这方面,Python非常强大。我建议您查看re module以获得更多高级处理。在你的实例中,它看起来只是迭代和扁平化的问题 - 所以像这样:

import re

def flatten_LDAP(data):
    response = {}

    # Iterate through each item
    for dirty_el in data:

        # Manually flatten. Not robust, but good enough
        cn = dirty_el[0][1]['cn'][0]

        # Get users in list comprehension
        users = [
            # Split user from the string
            re.split(r'=|,',member)[1] 

            # Iterate from flattened 'uniqueMember'
            for member in dirty_el[0][1]['uniqueMember']
        ]

        # Add to dictionary
        response[cn] = users

    # Return
    return response

应该做的伎俩

我确信你可以在LDAP的流媒体层上获得更多的花哨和处理 - 但我确信这就足够了。