Python 如何将字符串解析到字典中

Python 如何将字符串解析到字典中,python,dictionary,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')} 您可以使用JS

我试图解析一个字符串,以分离字符串中的列表。我目前拥有以下字符串:

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')}

您可以使用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']}

除了
字典
之外,您还可以拥有列表:
您可以使用
ast.literal\u 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')]]
试试这个

>>> 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中总是唯一的,这就是为什么在结果中显示更新的键值对以保留重复项并符合输入格式:

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
(如果您相信您的输入):

d的内容:

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

不过,我无法将它变成一行:-)

您可以从字符串中获得嵌套字典(比前面的答案简单一点)。感谢亚历克斯·马泰利对我的回答

输出:

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

字典中不能有重复的元素作为键。q1和q2在预期的输出中重复了两次,这是不可能的。除非通过重新定义类来改变Python词汇表的行为,但我想这不是目的:)是否有方法向字典中的现有键添加另一个值?是的,您可以像这样:
{q1':[('0','q1'),('1','q2'),'q2':[('0','q2'),('1','q1')]}
。这是你想要的吗?这不是OP所问的for@Hackaholic是的,我知道我没有投反对票。但正如我所说的OP dosent想要这个列表是一个有效的JSON,问题是OP的字符串包含单引号而不是双引号。这起作用了,我的问题已经解决。谢谢!
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))
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'}}