【问题标题】:merge common elements of a list of dictionary and store uncommon elements in a new key合并字典列表的常见元素并将不常见元素存储在新键中
【发布时间】:2020-12-30 14:04:37
【问题描述】:

我有一个很大的字典,其中的键包含项目列表,这些是无序的。我想将某些元素分组到一个新键中。例如

input= [{'name':'emp1','state':'TX','areacode':'001','mobile':123},{'name':'emp1','state':'TX','areacode':'002','mobile':234},{'name':'emp1','state':'TX','areacode':'003','mobile':345},{'name':'emp2','state':'TX','areacode':None,'mobile':None},]

对于上述输入,我想将区号和手机分组到一个新键 contactoptions

opdata = [{'name':'emp1','state':'TX','contactoptions':[{'areacode':'001','mobile':123},{'areacode':'002','mobile':234},{'areacode':'003','mobile':345}]},{'name':'emp2','state':'TX','contactoptions':[{'areacode':None,'mobile':None}]}]

我现在正在做这两个长时间的迭代。我想更有效地实现相同的记录数量很大。如果在 pandas 等包中可用,可以使用现有方法。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试

    result = (
        df.groupby(['name', 'state'])
          .apply(lambda x: x[['areacode', 'mobile']].to_dict(orient='records'))
          .reset_index(name='contactoptions')
        ).to_dict(orient='records')
    

    【讨论】:

      【解决方案2】:

      使用常规字典,您可以使用 setdefault 方法在单遍/循环中完成,无需排序:

      data = [{'name':'emp1','state':'TX','areacode':'001','mobile':123},{'name':'emp1','state':'TX','areacode':'002','mobile':234},{'name':'emp1','state':'TX','areacode':'003','mobile':345},{'name':'emp2','state':'TX','areacode':None,'mobile':None}]
      
      merged = dict()
      for d in data:
          od = merged.setdefault(d["name"],{k:d[k] for k in ("name","state")})
          od.setdefault("contactoptions",[]).append({k:d[k] for k in ("areacode","mobile")})
      merged = list(merged.values())
      

      输出:

      print(merged)
      # [{'name': 'emp1', 'state': 'TX', 'contactoptions': [{'areacode': '001', 'mobile': 123}, {'areacode': '002', 'mobile': 234}, {'areacode': '003', 'mobile': 345}]}, {'name': 'emp2', 'state': 'TX', 'contactoptions': [{'areacode': None, 'mobile': None}]}]
      

      【讨论】:

        【解决方案3】:

        如您所问,您想按“名称”和“状态”对输入项进行分组。

        我的建议是,您可以制作一个字典,其中键是“名称”加“状态”,例如 'emp1-TX',值是“区号”和“移动”列表,例如 [{'areacode':'001','mobile':123}]。在这种情况下,一次迭代就可以实现输出。

        输出:

        {'emp1-TX': [{'areacode':'001','mobile':123}, {'areacode':'001','mobile':123}, {'areacode':'003','mobile':345}], 'emp2-TX': [{'areacode':None,'mobile':None}]}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-27
          • 2021-10-29
          • 2019-05-22
          • 1970-01-01
          • 1970-01-01
          • 2012-07-06
          相关资源
          最近更新 更多