2017-03-01 36 views
1

我有一个这样的字符串:从字符串转换信息与dict

COLUMN 1: 
    A:       10.68 
    B:       11.82 
    C:       12.93 
    D:       50.2 
C 2: 
    Z:       68 
    S:       182 
    W:       13 
    E:       50  

什么是保持像一本字典的数据结构此信息的好方法?

更新:问题是,标题不一定以我的实际文本中的COLUMN开头,并且每个标题下的元素数可能与另一个不同。唯一的区别在于,在每个标题下,元素都以4个空格缩进。

+0

我不明白。你能举一个你想转换的字符串的具体例子吗? –

+1

嵌套字典可以像{1:{'A':10.68,'B':11.82},2:{'Z':68,'S':182}}一样使用。像列[1] ['A']一样访问它。 – Tristan

+0

@Tristan是的,这似乎是一个非常有用的结构。 –

回答

1

灵感有追加项目在@Vor的回答。

result, root = {}, None 

for i in q.split('\n'): 
    if i.strip().endswith(':'): 
     root = i.strip() 
     result[root] = {} 
    elif i: 
     val = list(map(lambda x: x.strip(), i.split(':'))) 
     result[root].update({val[0]: val[1]}) 

print(result) 

以下规则:

  • 头与:
  • 项目结束分隔符是:
  • 没有空行

的变化是,你可以存储每根密钥,Column X在var中,并检查此roo上的所有行t键,并迭代和更新这个键。

0

你可以这样创建嵌套的字典:

q = ''' 
COLUMN 1: 
    A:       10.68 
    B:       11.82 
    C:       12.93 
    d:       50.2 
COLUMN 2: 
    Z:       68 
    S:       182 
    W:       13 
    E:       50 
''' 

result = {} 
for line in q.split('\n'): 
    if line.strip() and not line[0].isspace(): 
     col = line.strip()[:-1] 
     result[col] = {} 
    elif line.strip(): 
     key, value = line.split(':') 
     result[col][key.strip()] = value.strip() 

print result 

结果:

{'COLUMN 2': {'S': '182', 'Z': '68', 'E': '50', 'W': '13'}, 'COLUMN 1': {'A': '10.68', 'C': '12.93', 'B': '11.82', 'd': '50.2'}} 

另外,如果顺序的问题,你可以让COLUMN x - 列出,为了

+0

我不希望算法依赖于关键字COLUMN –

+1

然后用':'分隔它,并检查值是否为''“' - 这将是你的'COLUMN' – Vor

+0

对不起,我没有清楚说明。请参阅最新的问题。 –

0

有轻微的调整类似:

res = {} 
for row in data.split('\n'): 
    if row[:4] != ' ': 
     res[row.strip(':')] = sub = {} 
    else: 
     k,v = row.split(':') 
     sub[k.strip()] =v.strip() 

print res 

输出是:

{'C 2': {'S': '182', 'Z': '68', 'E': '50', 'W': '13'}, 'COLUMN 1': {'A': '10.68', 'C': '12.93', 'B': '11.82', 'D': '50.2'}} 

如果为了事项,使用ordered_dict代替

+0

请编辑您的答案,使其适用于Python3。此代码仅适用于Python2.x。在Vor的回答下查看我的最新评论。 –