将一个字符串转换成字典列表

3
我有一个如下的字符串
 gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'

如果您仔细观察,它有点像2个字典: 规则:唯一,属性:地理,名称:unq1 和 规则:求和,属性:销售额,名称:sum_sales
我想将它们转换为以下格式:
 [
  {'rule': 'sum', 'attribute': 'sales', 'name': 'sum_sales'},
    {'rule': 'unique', 'attribute': 'geo', 'name': 'uniq1'}
 ]

请帮忙

我尝试过

gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'
 dlist=[]
 at_rule_gm=(x.split(':') for x in gmr.split(','))
 dict(at_rule_gm)

但是这里我只得到了最后一个字典。

3个回答

1

gmr='规则:唯一,属性:地理,name:unq1,规则:求和,属性:销售额,name:sum_sales' split_str = gmr.split(',') dlist = []

for num in range(0, len(split_str),3):

temp_dict = {}
temp1 = split_str[num]
temp2 = split_str[num+1]
temp3 = split_str[num+2]
key,value = temp1.split(':')
temp_dict.update({key:value})
key,value = temp2.split(':')
temp_dict.update({key:value})
key,value = temp3.split(':')
temp_dict.update({key:value})
dlist.append(temp_dict)

请在你的回答中添加一些上下文。 - Tobias Wilfert

1

从OP的示例开始:

>>> gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'

首先创建一个空列表。
>>> dlist = [ ]

使用entry循环遍历由gmr.split(',')生成的列表,
entry.split(':')存储到pair中,
检查pair中第一个值(键)是否为'rule'
如果是,则向dlist附加一个新的空字典,
将pair存储到dlist的最后一个条目中:
>>> for entry in gmr.split(','):
    pair = entry.split(':')
    if pair[0] == 'rule':
        dlist.append({ })
    dlist[-1][pair[0]] = pair[1]

打印结果:
>>> print(dlist)
[{'name': 'unq1', 'attribute': 'geo', 'rule': 'unique'},
   {'name': 'sum_sales', 'attribute': 'sales', 'rule': 'sum'}]

看起来就是 OP 想要的结果。


0

dict 总是返回一个单一的字典,而不是一个字典列表。如果需要后者,可以先按 'rule:' 分割,然后使用列表推导式:

gmr = 'rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'

items = (f'rule:{x}' for x in filter(None, gmr.split('rule:')))
res = [dict(x.split(':') for x in item.split(',') if x) for item in items]

print(res)

# [{'attribute': 'geo', 'name': 'unq1', 'rule': 'unique'},
#  {'attribute': 'sales', 'name': 'sum_sales', 'rule': 'sum'}]

TypeError Traceback (most recent call last) <ipython-input-367-dcc148ac40d3> in <module>() 1 items = (f'rule:{x}' for x in filter(None, gmr.split('rule:'))) ----> 2 res = [dict(x.split(':') for x in item.split(',') if x) for item in items]<ipython-input-367-dcc148ac40d3> in <listcomp>(.0) 1 items = (f'rule:{x}' for x in filter(None, gmr.split('rule:'))) ----> 2 res = [dict(x.split(':') for x in item.split(',') if x) for item in items]TypeError: 'dict' object is not callable - Kumar P
@KumarP,无法复制,我给出的示例可以正常工作,并且与您的输入完全相同。 - jpp
@KumarP,可能是因为你之前定义了一个名为dict的变量。不要这样做。使用d_dict_dct或其他名称。 - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接