Python 如何通过字符串转换成字典

Python 如何通过字符串转换成字典,python,string,parsing,Python,String,Parsing,我有一个字符串如下所示: “买方=鲍勃&卖方=一月&id\u a=234” 我想将其转换为字典: {“买方”:“Bob”,“卖方”:“Jan”,“id_a”:234} 然而,这个字符串可以以任何顺序出现,因此它也可以看起来像“seller=Jan&buyer=Bob&id_a=234”。当然,这仍然会导致相同的词典 如何在python中轻松地实现这一点?起初我使用的是.split(),但当我意识到存在多个可能的排序时,我必须创建一个超级混乱的解决方案来适应这种情况。有什么想法吗?你可以用 par

我有一个字符串如下所示:

“买方=鲍勃&卖方=一月&id\u a=234”

我想将其转换为字典:

{“买方”:“Bob”,“卖方”:“Jan”,“id_a”:234}

然而,这个字符串可以以任何顺序出现,因此它也可以看起来像“seller=Jan&buyer=Bob&id_a=234”。当然,这仍然会导致相同的词典

如何在python中轻松地实现这一点?起初我使用的是.split(),但当我意识到存在多个可能的排序时,我必须创建一个超级混乱的解决方案来适应这种情况。有什么想法吗?

你可以用

parse_qs
将解析作为字符串参数给出的查询字符串(类型为application/x-www-form-urlencoded的数据),并作为字典返回数据。字典键是唯一的查询变量名,值是每个名称的值列表

>>> import urllib.parse
>>> urllib.parse.parse_qs("buyer=Bob&seller=Jan&id_a=234")
{'buyer': ['Bob'], 'seller': ['Jan'], 'id_a': ['234']}
您还可以使用,它将解析作为字符串参数提供的查询字符串(类型为application/x-www-form-urlencoded的数据),并返回名称、值对列表

>>> urllib.parse.parse_qsl("buyer=Bob&seller=Jan&id_a=234")
[('buyer', 'Bob'), ('seller', 'Jan'), ('id_a', '234')]

这不是最漂亮的方法,但它应该能完成任务

example="buyer=Bob&seller=Jan&id_a=234"
pairs = example.split("&")
result = {}
for pair in pairs:
    key, value = pair.split("=")
    if value.isnumeric():
        result[key]=float(value)
    else:
        result[key]=value

肯定有更好的方法可以做到这一点,我相信,这是一种快速而肮脏的方法。

如果您想使用“基本”Python实现这一点,而不需要查询字符串解析库,我们可以尝试使用
re.findall

inp = "buyer=Bob&seller=Jan&id_a=234"
matches = re.findall(r'([^=&]+)=([^=&]+)', inp)
dict_1 = dict()

for key, value in matches: 
    dict_1.setdefault(key, []).append(value) 
print(dict_1)
这张照片是:

{'buyer': ['Bob'], 'id_a': ['234'], 'seller': ['Jan']}

您有许多键值对,它们都由
分隔。键和值本身由
=
分隔。这听起来像是
string.split()
的理想用例:

其输出为:

{'buyer': 'Bob', 'seller': 'Jan', 'id_a': '234', 'other': 'abc=7'}
这首先将整个键/值集拆分为各个键/值项,然后针对每个键/值项提取键和值,并将它们添加到字典中。输入字符串中键/值项的重新排序没有问题,因为字典没有排序


唯一的“秘密”位是限制键/值拆分,以确保只有第一个
=
字符才是拆分的字符。

如果需要更具体的类型,可以检查value和value.isnumeric()中的“.”是否为浮点,如果value.isnumeric()而不是“.”则值中的“.”则为int。
{'buyer': 'Bob', 'seller': 'Jan', 'id_a': '234', 'other': 'abc=7'}