86

我有一个看起来像这样的字符串:

"Name1=Value1;Name2=Value2;Name3=Value3"

Python 中是否有一个内置的类/函数将获取该字符串并构造一个字典,就好像我已经这样做了:

dict = {
    "Name1": "Value1",
    "Name2": "Value2",
    "Name3": "Value3"
}

我浏览了可用的模块,但似乎找不到任何匹配的东西。


谢谢,我确实知道如何自己制作相关代码,但是由于这种小型解决方案通常是等待发生的雷区(即有人写道:Name1='Value1=2';)等等,所以我通常更喜欢一些预先测试功能。

那我自己做吧。

4

6 回答 6

149

没有内置函数,但您可以通过生成器理解相当简单地完成此操作:

s= "Name1=Value1;Name2=Value2;Name3=Value3"
dict(item.split("=") for item in s.split(";"))

[编辑] 从您的更新中,您表明您可能需要处理报价。这确实使事情复杂化,具体取决于您要查找的确切格式是什么(接受什么引号字符,什么转义字符等)。您可能想查看 csv 模块,看看它是否可以覆盖您的格式。这是一个示例:(请注意,此示例的 API 有点笨拙,因为 CSV 旨在遍历一系列记录,因此我进行 .next() 调用只是为了查看第一行。调整为满足您的需求):

>>> s = "Name1='Value=2';Name2=Value2;Name3=Value3"

>>> dict(csv.reader([item], delimiter='=', quotechar="'").next() 
         for item in csv.reader([s], delimiter=';', quotechar="'").next())

{'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1=2'}

但是,根据格式的确切结构,您可能需要编写自己的简单解析器。

于 2008-10-09T11:43:42.087 回答
6

这接近于做你想做的事:

>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
于 2011-03-01T02:46:12.353 回答
4
s1 = "Name1=Value1;Name2=Value2;Name3=Value3"

dict(map(lambda x: x.split('='), s1.split(';')))
于 2019-03-04T13:23:26.300 回答
1

它可以简单地通过字符串连接和列表理解来完成

",".join(["%s=%s" % x for x in d.items()])

>>d = {'a':1, 'b':2}
>>','.join(['%s=%s'%x for x in d.items()])
>>'a=1,b=2'
于 2014-12-23T11:37:28.070 回答
-2
easytiger $ cat test.out test.py | sed 's/^/    /'
p_easytiger_quoting:1.84563302994
{'Name2': 'Value2', 'Name3': 'Value3', 'Name1': 'Value1'}
p_brian:2.30507516861
{'Name2': 'Value2', 'Name3': "'Value3'", 'Name1': 'Value1'}
p_kyle:7.22536420822
{'Name2': ['Value2'], 'Name3': ["'Value3'"], 'Name1': ['Value1']}
import timeit
import urlparse

s = "Name1=Value1;Name2=Value2;Name3='Value3'"

def p_easytiger_quoting(s):
    d = {}
    s = s.replace("'", "")
    for x in s.split(';'):
        k, v = x.split('=')
        d[k] = v
    return d


def p_brian(s):
    return dict(item.split("=") for item in s.split(";"))

def p_kyle(s):
    return urlparse.parse_qs(s)



print "p_easytiger_quoting:" + str(timeit.timeit(lambda: p_easytiger_quoting(s)))
print p_easytiger_quoting(s)


print "p_brian:" + str(timeit.timeit(lambda: p_brian(s)))
print p_brian(s)

print "p_kyle:" + str(timeit.timeit(lambda: p_kyle(s)))
print p_kyle(s)
于 2013-03-26T23:59:36.120 回答
-2

如果您的 Value1、Value2 只是实际值的占位符,您还可以将该dict()函数与eval().

>>> s= "Name1=1;Name2=2;Name3='string'"
>>> print eval('dict('+s.replace(';',',')+')')
{'Name2: 2, 'Name3': 'string', 'Name1': 1}

这是因为dict()函数理解语法dict(Name1=1, Name2=2,Name3='string')。字符串中的空格(例如在每个分号之后)被忽略。但请注意,字符串值确实需要引用。

于 2013-04-24T10:22:23.813 回答