在Python中将配置文件列表转换为字典

时间:2014-03-11 08:06:53

标签: python

我在python中遇到了一个基本问题。我有这个清单:

['[A]',a,b,c,x,y,'[B]',d,f,'[C]',g,h,e]

我想将其转换为字典:

{A:[a,b,c,x,y],B:[d,f],C:[g,h,e]} 

有没有人有任何优雅的想法? 谢谢

4 个答案:

答案 0 :(得分:4)

如果您使用密钥在列表中的事实,那么您可以按列表进行分组,将结果配对并将其提供给dict,例如:

from itertools import groupby, izip

data = [['A'],'a','b','c',['B'],'d','e','f',['C'],'g','h','e']
grouped = (next(g)[0] if k else list(g) for k, g in groupby(data, lambda L: isinstance(L, list)))
result = dict(izip(*[iter(grouped)] * 2))
#{'A': ['a', 'b', 'c'], 'C': ['g', 'h', 'e'], 'B': ['d', 'e', 'f']}

根据comment

进行了更新
  

......是字符串:['[A]','a','b','c','x','y','[B]','d','f' ,'[C]','g','h','e']以及确定密钥的规则是它是一个字符串'[someString]'

更改分组以使用正则表达式(根据需要进行调整),例如:

import re

grouped = (k.group(1) if k else list(g) for k, g in groupby(data, re.compile(r'\[(.*?)\]$').match))

答案 1 :(得分:3)

假设块总是相同的大小,你可以编写这样的字典理解(输入列表是l):

{l[i][0]: l[i+1:i+4] for i in range(0, len(l), 4)}

答案 2 :(得分:0)

如果块大小是动态的,我会使用一些关于配置变量类型的假设以及类型检查(这在python中通常不是一个好主意,但在这种情况下我认为它有助于可读性) :

from collections import defaultdict

a = [['A'],'a','b','c',['B'],'d','e','f',['C'],'g','h','e']

grouper = None
config = defaultdict(list)
for x in a:
    if isinstance(x, (list, tuple)):
        # We encountered a list or tuple, so this is a new section
        grouper = x[0]
    else:
        config[grouper].append(x)

print config

结果:

defaultdict(<type 'list'>, {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'], 'C': ['g', 'h', 'e']})

答案 3 :(得分:0)

我知道它的愚蠢...
我知道。
但它有效:)

def convert(l):
    keys = [i for i in l if isinstance(i, list)]
    keys_index = [l.index(i) for i in keys]
    keys_index.append(None)
    result = {}
    for i in range(0, len(keys_index)-1):
        result[l[keys_index[i]][0]] = [j for j in l[keys_index[i]+1:keys_index[i+1]]]
    return result