我有一个看起来像这样的字符串:
"Name1=Value1;Name2=Value2;Name3=Value3"
Python中是否有一个内置的类/函数来接受该字符串并构造一个字典,就好像我这样做了:
dict = {
"Name1": "Value1",
"Name2": "Value2",
"Name3": "Value3"
}
我查看了可用的模块,但似乎找不到匹配的内容。
谢谢,我知道如何自己制作相关的代码,但是因为这些小的解决方案通常是我的领域等待发生(即有人写道:Name1 ='Value1 = 2';)等等,我通常更喜欢一些预先测试的功能。
我会自己做的。
答案 0 :(得分:126)
没有内置,但你可以通过生成器理解来完成这个:
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'}
根据格式的确切结构,您可能需要编写自己的简单解析器。
答案 1 :(得分:5)
这接近你想做的事情:
>>> import urlparse
>>> urlparse.parse_qs("Name1=Value1;Name2=Value2;Name3=Value3")
{'Name2': ['Value2'], 'Name3': ['Value3'], 'Name1': ['Value1']}
答案 2 :(得分:2)
s1 = "Name1=Value1;Name2=Value2;Name3=Value3"
dict(map(lambda x: x.split('='), s1.split(';')))
答案 3 :(得分:0)
可以通过字符串连接和列表理解来简单地完成
',' .join(['%s =%s'%x代表d.items()中的x)
>>d = {'a':1, 'b':2}
>>','.join(['%s=%s'%x for x in d.items()])
>>'a=1,b=2'
答案 4 :(得分:-1)
如果您的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')
。字符串中的空格(例如,在每个分号后)将被忽略。但请注意,字符串值确实需要引用。
答案 5 :(得分:-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)