Python 合并字典列表中的常用元素,并将不常用元素存储在新键中

Python 合并字典列表中的常用元素,并将不常用元素存储在新键中,python,pandas,Python,Pandas,我有一本很大的字典,里面有一系列的条目,这些都是无序的。我想将某些元素分组到一个新键中。比如说 输入=[{'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

我有一本很大的字典,里面有一系列的条目,这些都是无序的。我想将某些元素分组到一个新键中。比如说

输入=[{'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':无,]

对于以上输入,我想在新的按键contactoptions中将区号和手机分组

我现在用两个长迭代来完成这项工作。我想更有效地实现同样的目标,因为记录的数量很大。开放使用现有方法(如果在pandas等软件包中可用)。

试试看

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


如您所问,您希望按“名称”和“状态”将输入项分组在一起

我的建议是,您可以制作一个字典,其中键为'name'加上'state',如'emp1 TX',值为'areacode'列表和'mobile',如[{'areacode':'001','mobile':123}]。在这种情况下,可以在一次迭代中获得输出

输出:

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

如您所问,您希望按“名称”和“状态”将输入项分组在一起

我的建议是,您可以制作一个字典,其中键为'name'加上'state',如'emp1 TX',值为'areacode'列表和'mobile',如[{'areacode':'001','mobile':123}]。在这种情况下,可以在一次迭代中获得输出

输出:

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

对于常规字典,您可以使用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}]}]

对于常规字典,您可以使用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}]}]