Skip to main content
 首页 » 编程设计

python之使用字典从字符串中检索字典列表

2025年05月04日37me-sa

我有多个字典,它们不是用逗号分隔的,类型是字符串,是否可以将它们分开并在列表中获得好的元素,每个元素代表一个字典。

例如: 我有什么:{} {} {}

我想要的 [{}、{}、{}]

我知道它类似于 Want to separate list of dictionaries not separated by comma , 但我不想调用子进程并调用 sed。

示例:

data  = {"key1":"val1", "key2":"val2", "key3":"val3", "key4":"val4"} {"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"} {"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"} 
 
what i want is  : 
 
[{"key1":"val1", "key2":"val2", "key3":"val3", "key4":"val4"} ,  
 {"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"},  
 {"key1":"someval", "key2":"someval", "key3":"someval", "key4":"someval"}] 

我如何实现这一目标。

示例 2:

string = '''{"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109897,"Title":"Prop 1","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: {some data \n  some link http:\\www.ggogle\.com with some sepcial characters ">< ?? // {} [] ;;}","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"} 
{"Date1":"2017-02-13T00:00:00.000Z","peerval":"222.22000","PID":109890,"Title":"Prop 2","Temp":5,"Temp Actual":5,"Temp Predicted":3.9,"Level":"Medium","Explaination":"Source: {some data \n  some link http:\\www.ggogle\.com with some sepcial characters ">< ?? // {} [] ;;}","creator":"\\etc\\someid","createdtime" :"2017-02-12T15:24:38.380Z"} 

'''

注意:每个字典都以 $(newline) 结尾

请您参考如下方法:

这种方法有点慢(关于字符串长度大约为 O(N^2)),但它可以处理相当复杂的文字语法,包括嵌套数据结构。在连续较小的 s 切片上循环调用 ast.literal_eval,直到找到语法上有效的切片。然后删除该切片并继续,直到字符串为空。

import ast 
 
def parse_consecutive_literals(s): 
    result = [] 
    while s: 
        for i in range(len(s), 0, -1): 
            #print(i, repr(s), repr(s[:i]), len(result)) 
            try: 
                obj = ast.literal_eval(s[:i]) 
            except SyntaxError: 
                continue 
            else: 
                result.append(obj) 
                s = s[i:].strip() 
                break 
        else: 
            raise Exception("Couldn't parse remainder of string: " + repr(s)) 
    return result 
 
test_cases = [ 
    "{} {} {}", 
    "{}{}{}", 
    "{1: 2, 3: 4}{5:6, '7': [8, {9: 10}]}", 
    "[11] 'twelve' 13 14.0", 
    "{} {\"'hi '}'there\"} {'whats \"}\"{\"up'}", 
    "{1: 'foo\\'}bar'}" 
] 
 
for s in test_cases: 
    print("{} parses into {}".format(repr(s), parse_consecutive_literals(s))) 

结果:

'{} {} {}' parses into [{}, {}, {}] 
'{}{}{}' parses into [{}, {}, {}] 
"{1: 2, 3: 4}{5:6, '7': [8, {9: 10}]}" parses into [{1: 2, 3: 4}, {5: 6, '7': [8, {9: 10}]}] 
"[11] 'twelve' 13 14.0" parses into [[11], 'twelve', 13, 14.0] 
'{} {"\'hi \'}\'there"} {\'whats "}"{"up\'}' parses into [{}, {"'hi '}'there"}, {'whats "}"{"up'}] 
"{1: 'foo\\'}bar'}" parses into [{1: "foo'}bar"}] 

但是,我并没有热情地认可这种用于生产质量代码的解决方案。首先以更合理的格式序列化您的数据会好得多,例如 json。