简体   繁体   中英

Parse string in python in dict

I have a string after sql query like this: "['user_id=c370,'good_cnt=2','good_id=1999','igoodid=12341','good_id=1111','good_id=1214','good_id=1437']" Can I parse it not manually in dict: {'user_id': 'c370','good_cnt':2,'good_id': [1999, 12341, 1111, 1214, 1437]"

>>> from ast import literal_eval
>>> from urllib.parse import parse_qs
>>> literal_eval(s)
['user_id=c370', 'good_cnt=2', 'good_id=1999', 'igoodid=12341', 'good_id=1111', 'good_id=1214', 'good_id=1437']
>>> '&'.join(literal_eval(s))
'user_id=c370&good_cnt=2&good_id=1999&igoodid=12341&good_id=1111&good_id=1214&good_id=1437'
>>> parse_qs('&'.join(literal_eval(s)))
{'user_id': ['c370'], 'good_cnt': ['2'], 'good_id': ['1999', '1111', '1214', '1437'], 'igoodid': ['12341']}

Unless you have specific reasons not to use this, this seems like the sanest option. If you really want some values as single values and others as lists, you could post-process this:

>>> {k: v[0] if len(v) == 1 else v for k, v in parse_qs('&'.join(literal_eval(s))).items()}
{'user_id': 'c370', 'good_cnt': '2', 'good_id': ['1999', '1111', '1214', '1437'], 'igoodid': '12341'}

Or, to go for a complete different approach:

r = {}

for i in literal_eval(s):
    k, v = i.split('=')

    if k not in r:
        r[k] = v
    elif isinstance(r[k], list):
        r[k].append(v)
    else:
        r[k] = [r[k], v]
>>> r
{'user_id': 'c370', 'good_cnt': '2', 'good_id': ['1999', '1111', '1214', '1437'], 'igoodid': '12341'}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM