2017-03-01 37 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的回答下查看我的最新評論。 –