将Python字符串转换为字典

use*_*542 0 python json dictionary

我有一个字符串:

A = "{user_id:34dd833,category:secondary,items:camera,type:sg_ser}"
Run Code Online (Sandbox Code Playgroud)

我需要将它转换为python字典,以便:

A = {"user_id":"34dd833", "category": "secondary", "items": "camera", "type": "sg_ser"}
Run Code Online (Sandbox Code Playgroud)

最重要的是,还有两个问题:

1:"items"键应该有多个值,例如:

A = {"user_id":34dd833, "category": "secondary", "items": "camera,vcr,dvd", "type": "sg_ser"}
Run Code Online (Sandbox Code Playgroud)

这显然是以字符串的形式出现的:

A = "{user_id:34dd833,category:secondary,items:camera,vcr,dvd,type:sg_ser}"
Run Code Online (Sandbox Code Playgroud)

因此,基于逗号分离推广任何内容都变得毫无用处.

2:字符串的顺序也可以是随机的.所以,字符串也可以这样:

A = "{category:secondary,type:sg_ser,user_id:34dd833,items:camera,vcr,dvd}"
Run Code Online (Sandbox Code Playgroud)

这使得任何按顺序假设为虚假的过程.

在这种情况下该怎么办?非常感谢.

aba*_*ert 7

如果我们可以假设你的输入没有做任何引用或转义(你的例子没有,但这并不一定意味着它是一个很好的假设),并且你永远不能用逗号分隔多个键,只有多个值(这可能一个很好的假设,因为否则格式不明确......):

首先,让我们放下大括号,然后拆分冒号:

>>> A = "{user_id:34dd833,category:secondary,items:camera,vcr,dvd,type:sg_ser}"
>>> A[1:-1].split(':')
['user_id', '34dd833,category', 'secondary,items', 'camera,vcr,dvd,type', 'sg_ser']
Run Code Online (Sandbox Code Playgroud)

因此,第一个条目是第一个键,最后一个条目是最后一个值,其间的每个条目是第N个值,后跟逗号,后跟第N + 1个键.那里可能有其他逗号,但最后一个总是从第N + 1个键中分割出第N个值.(这甚至适用于N = 0 - 没有逗号,所以最后一个逗号不会从第0个键中分割出来.但不幸的是,它不适用于最后一个条目.我稍后会讨论它.)

我们可以通过各种方式简化这些内容,但让我们先将代码明确地写为代码,以便了解其工作原理.

>>> d = {}
>>> entries = A[1:-1].split(':')
>>> for i in range(len(entries)-1):
...     key = entries[i].rpartition(',')[-1]
...     value = entries[i+1].rpartition(',')[0]
...     d[key] = value
Run Code Online (Sandbox Code Playgroud)

这几乎是对的:

>>> d
{'category': 'secondary', 'items': 'camera,vcr,dvd', 'type': '', 'user_id': '34dd833'}
Run Code Online (Sandbox Code Playgroud)

如上所述,它不适用于最后一个.应该明白为什么; 如果没有,请查看rpartition(',')最后一个值的返回值.您可以手动修补它,或者只是通过,在末尾打包一个额外的欺骗(entries = (A[1:-1] + ',').split(':')).但如果你考虑一下,如果你只是rsplit代替rpartition,那么[0]做对了.所以让我们这样做吧.

那么,我们怎样才能清理一下呢?

首先让我们转换entries成相邻对的列表.现在,每一个用于每一对(n, nplus1),n.rpartition(',')[-1]是关键,并且nplus1.rsplit(',', 1)[0]是相应的值.所以:

>>> A = "{user_id:34dd833,category:secondary,items:camera,vcr,dvd,type:sg_ser}"
>>> entries = A[1:-1].split(':')
>>> adjpairs = zip(entries, entries[1:])
>>> d = {k.rpartition(',')[-1]: v.rsplit(',', 1)[0] for k, v in adjpairs}
Run Code Online (Sandbox Code Playgroud)

  • 它应该是最后一行中的'v.rsplit(',',1)[0]`,否则你只能在项目中获得"相机". (2认同)