2014-12-04 56 views
2

我試圖解析字符串,從字符串分隔列表。我目前擁有的字符串:如何解析字符串轉換成字典

string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" 

有沒有什麼方法來解析字符串,以便詞典關鍵是列表的第一個元素和鍵的值是旁邊的元素。例如:

{'q1': ('0','q1'), 'q1': ('1','q2'), 'q2': ('0','q2'), 'q2': ('1', 'q1')} 
+5

你不能在字典中重複的元素作爲鍵。 q1和q2在預期輸出中重複兩次,你不能擁有這個。 – user3 2014-12-04 08:25:51

+0

除非你重新定義一個類改變一個Python dictionnary的行爲,但我想這不是目的:) – 2014-12-04 08:28:10

+0

是有辦法的另一個值添加到字典中現有的密鑰? – user3246978 2014-12-04 08:29:54

回答

4

dictionary insted的,你可以有列表:
你可以使用ast.literal_eval從字符串解析python數據結構

>>> import ast 
>>> my_string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" 
>>> k = ast.literal_eval(my_string) 
>>> k 
[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']] 
>>> [[x[0],tuple(x[1:])] for x in k] 
[['q1', ('0', 'q1')], ['q1', ('1', 'q2')], ['q2', ('0', 'q2')], ['q2', ('1', 'q1')]] 
+0

這工作,我的問題已修復。謝謝! – user3246978 2014-12-04 09:20:33

+0

你能接受我的答,如果這個工程:) – Hackaholic 2014-12-04 09:21:18

3

您可以使用JSON但字符串格式必須是一個字典,你不能有2次相同的密鑰

import json 

string ='{"q": ["0", "q1"], "q1": ["1", "q2"], "q3": ["1", "q1"], "q2": ["0", "q2"]}' 

dict = json.loads(string) 

print dict 
Output: {'q': ['0', 'q1'], 'q1': ['1', 'q2'], 'q3': ['1', 'q1'], 'q2': ['0', 'q2']} 
+1

列表的列表是一個有效的JSON,問題是OP的字符串包含單引號而不是雙引號。 – 2014-12-04 08:45:45

2

試試這個

>>> import ast 
>>> ast.literal_eval(string) 
[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']] 
>>> list=ast.literal_eval(string) 
>>> d={} 
>>> for l in list: 
...  d[l[0]]=tuple(l[1:]) 
>>> d 
{'q1': ('1', 'q2'), 'q2': ('1', 'q1')} 

關鍵是始終處於字典這就是獨特爲什麼結果顯示更新的鍵值對

+1

這不是OP要求 – Hackaholic 2014-12-04 08:37:59

+0

@Hackaholic是我硝酸鉀只給想法 – 2014-12-04 08:39:08

+0

爲什麼下來表決的原因? – 2014-12-04 08:56:41

3

要保持副本,並符合輸入格式:

import collections 
import json 
string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" 
d = collections.defaultdict(list) 
for (k, v1, v2) in json.loads(string.replace("'",'"')): 
    d[k].append((v1, v2)) 

隨着eval (如果你信任你的輸入):

import collections 
string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" 
d = collections.defaultdict(list) 
for (k, v1, v2) in eval(string): 
    d[k].append((v1, v2)) 

d的內容:

defaultdict(<type 'list'>, { 
    'q1': [('0', 'q1'), ('1', 'q2')], 
    'q2': [('0', 'q2'), ('1', 'q1')] 
}) 

編輯:並沒有圖書館在所有。

string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" 
d = {} 
for (k, v1, v2) in eval(string): 
    d.setdefault(k, []).append((v1, v2)) 

我無法使之成爲一個班輪雖然:-)

2

你可以從你的字符串嵌套詞典(略比以前的答案那麼簡單)。感謝Alex馬爾泰利對他的回答Update value of a nested dictionary of varying depth

import ast 

def update(d, u): 
    for k, v in u.iteritems(): 
     if isinstance(v, dict): 
      r = update(d.get(k, {}), v) 
      d[k] = r 
     else: 
      d[k] = u[k] 
    return d 

def listToDict(l): 
    temp = l[-1] 
    for value in l[-2::-1]: 
     temp = {value: temp} 
    return temp 

input = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" 

res = {} 
for l in ast.literal_eval(input): 
    update(res ,listToDict(l)) 
print res 

輸出:

{'q1': {'1': 'q2', '0': 'q1'}, 'q2': {'1': 'q1', '0': 'q2'}}