Convert a String representation of a Dictionary to a dictionary?

前端 未结 9 982
醉酒成梦
醉酒成梦 2020-11-21 05:22

How can I convert the str representation of a dict, such as the following string, into a dict?

s = \"{\'muffin\' : \'l         


        
相关标签:
9条回答
  • 2020-11-21 05:23

    Use json. the ast library consumes a lot of memory and and slower. I have a process that needs to read a text file of 156Mb. Ast with 5 minutes delay for the conversion dictionary json and 1 minutes using 60% less memory!

    0 讨论(0)
  • 2020-11-21 05:30
    string = "{'server1':'value','server2':'value'}"
    
    #Now removing { and }
    s = string.replace("{" ,"")
    finalstring = s.replace("}" , "")
    
    #Splitting the string based on , we get key value pairs
    list = finalstring.split(",")
    
    dictionary ={}
    for i in list:
        #Get Key Value pairs separately to store in dictionary
        keyvalue = i.split(":")
    
        #Replacing the single quotes in the leading.
        m= keyvalue[0].strip('\'')
        m = m.replace("\"", "")
        dictionary[m] = keyvalue[1].strip('"\'')
    
    print dictionary
    
    0 讨论(0)
  • 2020-11-21 05:33

    To OP's example:

    s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
    

    We can use Yaml to deal with this kind of non-standard json in string:

    >>> import yaml
    >>> s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
    >>> s
    "{'muffin' : 'lolz', 'foo' : 'kitty'}"
    >>> yaml.load(s)
    {'muffin': 'lolz', 'foo': 'kitty'}
    
    0 讨论(0)
  • 2020-11-21 05:33

    If the string can always be trusted, you could use eval (or use literal_eval as suggested; it's safe no matter what the string is.) Otherwise you need a parser. A JSON parser (such as simplejson) would work if he only ever stores content that fits with the JSON scheme.

    0 讨论(0)
  • 2020-11-21 05:35

    https://docs.python.org/3.8/library/json.html

    JSON can solve this problem though its decoder wants double quotes around keys and values. If you don't mind a replace hack...

    import json
    s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
    json_acceptable_string = s.replace("'", "\"")
    d = json.loads(json_acceptable_string)
    # d = {u'muffin': u'lolz', u'foo': u'kitty'}
    

    NOTE that if you have single quotes as a part of your keys or values this will fail due to improper character replacement. This solution is only recommended if you have a strong aversion to the eval solution.

    More about json single quote: jQuery.parseJSON throws “Invalid JSON” error due to escaped single quote in JSON

    0 讨论(0)
  • 2020-11-21 05:42

    To summarize:

    import ast, yaml, json, timeit
    
    descs=['short string','long string']
    strings=['{"809001":2,"848545":2,"565828":1}','{"2979":1,"30581":1,"7296":1,"127256":1,"18803":2,"41619":1,"41312":1,"16837":1,"7253":1,"70075":1,"3453":1,"4126":1,"23599":1,"11465":3,"19172":1,"4019":1,"4775":1,"64225":1,"3235":2,"15593":1,"7528":1,"176840":1,"40022":1,"152854":1,"9878":1,"16156":1,"6512":1,"4138":1,"11090":1,"12259":1,"4934":1,"65581":1,"9747":2,"18290":1,"107981":1,"459762":1,"23177":1,"23246":1,"3591":1,"3671":1,"5767":1,"3930":1,"89507":2,"19293":1,"92797":1,"32444":2,"70089":1,"46549":1,"30988":1,"4613":1,"14042":1,"26298":1,"222972":1,"2982":1,"3932":1,"11134":1,"3084":1,"6516":1,"486617":1,"14475":2,"2127":1,"51359":1,"2662":1,"4121":1,"53848":2,"552967":1,"204081":1,"5675":2,"32433":1,"92448":1}']
    funcs=[json.loads,eval,ast.literal_eval,yaml.load]
    
    for  desc,string in zip(descs,strings):
        print('***',desc,'***')
        print('')
        for  func in funcs:
            print(func.__module__+' '+func.__name__+':')
            %timeit func(string)        
        print('')
    

    Results:

    *** short string ***
    
    json loads:
    4.47 µs ± 33.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    builtins eval:
    24.1 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    ast literal_eval:
    30.4 µs ± 299 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    yaml load:
    504 µs ± 1.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
    *** long string ***
    
    json loads:
    29.6 µs ± 230 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    builtins eval:
    219 µs ± 3.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    ast literal_eval:
    331 µs ± 1.89 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    yaml load:
    9.02 ms ± 92.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    Conclusion: prefer json.loads

    0 讨论(0)
提交回复
热议问题