【问题标题】:Convert a string to list of dictionaries将字符串转换为字典列表
【发布时间】:2019-05-29 20:11:05
【问题描述】:

我有一个字符串如下

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

如果您清楚地看到它的类型 2 字典 规则:唯一,属性:地理位置,名称:unq1 和 rule:sum,attribute:sales,name: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)

但在这里我只得到最后一本字典。

【问题讨论】:

    标签: python python-3.x string list dictionary


    【解决方案1】:

    从 OP 样本开始:

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

    先做一个空列表。

    >>> dlist = [ ]
    

    在列表中使用entry 循环,由gmr.split(',') 产生,

    entry.split(':') 存储到pair

    检查pair(key)中的第一个值是否为'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 想要得到的。

    【讨论】:

      【解决方案2】:

      gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,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)
      

      【讨论】:

      • 请在您的答案中添加一些上下文。
      【解决方案3】:

      dict 总是给出一个字典,而不是字典的list。对于后者,您可以在第一次按'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 (最近一次调用最后一次) in () 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] in (.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
      • @KumarP,无法复制,我给出的示例运行良好,与您的输入相同。
      • @KumarP,这可能是因为您之前定义了一个变量dict。不要这样做。使用d_dict_dct 或其他内容。
      猜你喜欢
      • 2011-07-12
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多