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

时间:2016-04-29 04:01:59

标签: python python-2.7

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

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

results=""
for i in [entry for dn, entry in result if isinstance(entry, dict)]:
    results += str(i.get('distinguishedName')[0] +","+ i.get('sAMAccountName')[0] + "\n").replace("\, ","--")        
print results

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

{{1}}

如果我将结果作为列表开始创建会更容易吗?

2 个答案:

答案 0 :(得分:0)

对于每一行:

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

现在你有这样的事情:

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

然后:

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']}

答案 1 :(得分:0)

要使“字段留空”行为,您将需要计算每个字段的最大数量。我相信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'])