在新的嵌套字典中按值对字典进行分组

group dictionary by values in a new nested one

早上好, 我需要一些帮助来订购 Python 字典列表。 基本上我有这样的东西:

[{'code': 'xx1', 'group': 20, 'family': 21, 'line': 244, 'product': 120},
{'code': 'xx2', 'group': 20, 'family': 21, 'line': 244, 'product': 120},
{'code': 'xx3', 'group': 20, 'family': 21, 'line': 244, 'product': 120},
{'code': 'xx4', 'group': 9, 'family': 78, 'line': 136, 'product': 201},
{'code': 'xx5', 'group': 9, 'family': 78, 'line': 136, 'product': 201},
{'code': 'xx6', 'group': 22, 'family': 10, 'line': 245, 'product': 106},
{'code': 'xx8', 'group': 5, 'family': 17, 'line': 1, 'product': 29},
{'code': 'xx9', 'group': 5, 'family': 17, 'line': 1, 'product': 29}]

我想按组、系列、系列和产品的唯一值进行分组,并将结果放入如下所示的内容中:

[{'codes': ['xx1','xx2','xx3'], 'group': 20, 'family': 21, 'line': 244, 'product': 120},
{'codes': ['xx5','xx5'], 'group': 9, 'family': 78, 'line': 136, 'product': 201},
{'codes': ['xx6'], 'group': 22, 'family': 10, 'line': 245, 'product': 106},
{'codes': ['xx8','xx9'], 'group': 5, 'family': 17, 'line': 1, 'product': 29}]

其中 "codes" 是分组代码的列表。

我想到了 itertools 或集合..但我无法实现..完全卡住.. 非常感谢您的帮助! 谢谢。

对了,itertools很有帮助:

dd = [{'code': 'xx1', 'group': 20, 'family': 21, 'line': 244, 'product': 120},
      {'code': 'xx2', 'group': 20, 'family': 21, 'line': 244, 'product': 120},
      {'code': 'xx3', 'group': 20, 'family': 21, 'line': 244, 'product': 120},
      {'code': 'xx4', 'group': 9, 'family': 78, 'line': 136, 'product': 201},
      {'code': 'xx5', 'group': 9, 'family': 78, 'line': 136, 'product': 201},
      {'code': 'xx6', 'group': 22, 'family': 10, 'line': 245, 'product': 106},
      {'code': 'xx8', 'group': 5, 'family': 17, 'line': 1, 'product': 29},
      {'code': 'xx9', 'group': 5, 'family': 17, 'line': 1, 'product': 29}]

首先构建一个提取除'code'以外的所有项目的函数:

func = lambda x: {k:v for k,v in x.iteritems() if k != 'code'}

然后用这个函数:

out = []
for d, vals in itertools.groupby(sorted(dd, key=func), key=func):
    d['code'] = [val['code'] for val in vals]
    out.append(d)

returns

[{'code': ['xx6'], 'family': 10, 'group': 22, 'line': 245, 'product': 106},
 {'code': ['xx8', 'xx9'], 'family': 17, 'group': 5, 'line': 1, 'product': 29},
 {'code': ['xx1', 'xx2', 'xx3'], 'family': 21, 'group': 20, 'line': 244, 'product': 120},
 {'code': ['xx4', 'xx5'], 'family': 78, 'group': 9, 'line': 136, 'product': 201}]