如何将字符串解析为字典

时间:2014-12-04 08:24:51

标签: python dictionary

我正在尝试解析字符串以分隔字符串中的列表。我目前有字符串:

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 个答案:

答案 0 :(得分:4)

而不是dictionary您可以拥有列表:
您可以使用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')]]

答案 1 :(得分:3)

您可以使用JSON,但字符串格式必须是dict 不能拥有相同密钥的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']}

答案 2 :(得分: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))

我无法将其作为单行代码: - )

答案 3 :(得分: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')}

键在dict中始终是唯一的,这就是为什么结果显示更新的键值对

答案 4 :(得分:2)

您可以从字符串中获取嵌套字典(比之前的答案稍微简单一点)。感谢Alex Martelli对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'}}