在python中从字符串或列表中提取列

2024-09-30 06:23:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从python中的一系列值中提取列。值字符串如下所示-

CN=Unix ADISID,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1001
CN=1002--DS,OU=Process,DC=dom,DC=ab,DC=com,1002
CN=1003--Cyb,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,1003
CN=Doe--Joe,OU=Adm,DC=dom,DC=ab,DC=com,d1004
CN=cruise--bob,OU=SA,OU=DGO,DC=dom,DC=ab,DC=com,d1005

现在我想从这个字符串中提取列标题为CN,OU1,OU2,DC1,DC2,DC3,ID。每一行中OU和DC值的数量是不同的,所以如果它们不在一行中,我希望将该列保留为空白。另外,我使用下面的代码生成上面的字符串。在

^{pr2}$

如果我把结果作为一个列表开始创建,会不会更简单?在


Tags: 字符串comabsadsunixoudc
2条回答

要获得“字段留空”行为,必须计算每个字段的最大数量。我相信CN是唯一的,所以应该总是1。在

result = l.search_s(base, ldap.SCOPE_SUBTREE, criteria, attributes)

users = []

for i in [entry for dn, entry in result if isinstance(entry, dict)]:
    dn = i.get('distinguishedName')[0].replace('\, ', ' ').split(',')
    info = collections.defaultdict(list)
    info['id'] = i.get('sAMAccountName')[0]

    for part in dn:
        key,value = part.split('=',1)
        info[key].append(value)

    users.append(info)

max_cn = max(map(lambda u: len(u['CN']), users))
assert max_cn == 1

max_ou = max(map(lambda u: len(u['OU']), users))
max_dn = max(map(lambda u: len(u['DN']), users))

numflds = max_cn + max_ou + max_dn

fields = []
for u in users:
    f = [u['CN']]
    ou = u['OU'] + [''] * max_ou
    f.extend(ou[:max_ou])
    dn = u['DN'] + [''] * max_dn
    f.extend(dn[:max_dn])
    f.append(u['id'])

每行:

pairs = [kv.split('=') for kv in line.split(',')]
for pair in pairs:
    if len(pair) == 1:
        pair.insert(0, 'ID')

现在你有了这样的东西:

^{pr2}$

然后:

from collections import defaultdict

mapping = defaultdict(list)
for k,v in pairs:
    mapping[k].append(v)

这给了你:

{'CN': ['Unix ADISID'],
 'DC': ['dom', 'ab', 'com'],
 'ID': ['1001'],
 'OU': ['SA', 'DGO']}

相关问题 更多 >

    热门问题