Home  >  Q&A  >  body text

python 如何把'a=b'这样的字符解析成dict类型

比如:
'a=b'这样的字符数据,转换成python中的dict类型,{'a':'b'}。

ringa_leeringa_lee2622 days ago893

reply all(5)I'll reply

  • 天蓬老师

    天蓬老师2017-04-17 11:52:43

    如果只是'a=b'这样的字符串,那么跟QueryString的语法类似,用Python的urlparse.parse_qsl函数就可以搞定:

    import urlparse
    ret = dict(urlparse.parse_qsl('a=b'))
    

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-17 11:52:43

    我假设你有一堆这种数据,要存储到同一个字典里(否则你的问题就没什么意义了):

    >>> import sys
    >>> dict(l.split('=', 1) for l in sys.stdin)
    

    reply
    0
  • PHP中文网

    PHP中文网2017-04-17 11:52:43

    第一想到的是 exec

    # http://codepad.org/25Zwz7ys
    namespace = {}
    exec("a='b';c='d'", namespace)
    del namespace['__builtins__']
    print namespace
    

    但是好像有点不合题意,第二想到的是 str.split,上面已经有了,不作举例。

    然后我丧心病狂地想到 ConfigParser...

    class toDict(object):
        def __new__(self, *data):
            if not data:
                return {}
    
            import os
            import ConfigParser
    
            parser = ConfigParser.ConfigParser()
            buf = 'buffer.buf'
    
            f = open(buf, 'w')
            f.write("[section_data]" + os.linesep)
            for i in data:
                f.write(i + os.linesep)
            f.close()
    
            parser.read(buf)
            items = parser.items("section_data")
    
            ret = {}
            for i in items:
                ret[i[0]] = i[1]
    
            os.remove(buf)
            del parser
    
            return ret
    
    if __name__ == '__main__':
        print toDict()
            # {}
        print toDict("a=b")
            # {'a': 'b'}
        print toDict("a=b", "c=d", "你好=世界", "1=2")
            # {'a': 'b', '1': '2', 'c': 'd', '\xc4\xe3\xba\xc3': '\xca\xc0\xbd\xe7'}
    

    reply
    0
  • 阿神

    阿神2017-04-17 11:52:43

    dict(a=1) 是可以成这样的 {'a': 1}

    请看楼下的,没注意到'a=b'是一个字符串。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-17 11:52:43

    # coding: utf-8
    l = dict()
    s = "a=b".split("=")
    l[s[0]] = s[1]
    print l
    

    reply
    0
  • Cancelreply