我正在尝试解析字符串以分隔字符串中的列表。我目前有字符串:
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')}
答案 0 :(得分:4)
而不是dictionary
您可以拥有列表:
您可以使用ast.literal_eval
从字符串
>>> 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'}}