通过某个键合并字典列表

我有一个由相同结构list组成的,dict

sample = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':4}, {'a':2, 'b':2, 'c':5}, {'a':2, 'b':3, 'c':5}]

我想按键组合它们a,输出应该是

[{'a': 1, 'd': [{'b':2, 'c':3}, {'b':2, 'c':4}]}, {'a': 2, 'd': [{'b':2, 'c':5}, {'b': 3, 'c':5}]}]


慕娘9325324
浏览 168回答 5
5回答

繁星coding

您可以使用itertools.groupby:>>> from itertools import groupby>>> result = []>>> for key, group in groupby(sorted(sample, key=lambda x:x['a']), key=lambda x:x.pop('a')):        result.append({'a':key, 'd':[*group]})>>> result[{'a': 1, 'd': [{'b': 2, 'c': 3}, {'b': 2, 'c': 4}]}, {'a': 2, 'd': [{'b': 2, 'c': 5}, {'b': 3, 'c': 5}]}]sorted注意:如果保证字典列表按 key 的值排序,则不需要a。

开满天机

按键组合:dict_list = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':4}, {'a':2, 'b':2, 'c':5}, {'a':2, 'b':3, 'c':5}]new_dict = {}for d in dict_list:    a = d.pop('a', None)    if new_dict.get(a):         new_dict[a].append(d)    else:        new_dict[a] = [d]转换为列表:final_list = [{'a': key, 'd': value} for key, value in new_dict.items()]print(final_list)[{'a': 1, 'd': [{'c': 3, 'b': 2}, {'c': 4, 'b': 2}]}, {'a': 2, 'd': [{'c': 5, 'b': 2}, {'c': 5, 'b': 3}]}]

互换的青春

sample = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':4}, {'a':2, 'b':2, 'c':5}, {'a':2, 'b':3, 'c':5}]tmp = {}for v in sample:    tmp.setdefault(v['a'], []).append(v)    del v['a']out = [{'a': k, 'd': v} for k, v in tmp.items()]from pprint import pprintpprint(out)印刷:[{'a': 1, 'd': [{'b': 2, 'c': 3}, {'b': 2, 'c': 4}]}, {'a': 2, 'd': [{'b': 2, 'c': 5}, {'b': 3, 'c': 5}]}]

倚天杖

不幸的是,这可能是一个有点曲折的代码,但它有效:from itertools import groupbysample = [{'a':1, 'b':2, 'c':3},          {'a':1, 'b':2, 'c':4},          {'a':2, 'b':2, 'c':5},          {'a':2, 'b':3, 'c':5}]main_key = "a"print(    [{main_key:k,      "d": [{kk: vv for kk, vv in dct.items() if kk != main_key}            for dct in v]}     for k, v in groupby(sample, lambda d:d[main_key])])给出:[{'a': 1, 'd': [{'b': 2, 'c': 3}, {'b': 2, 'c': 4}]}, {'a': 2, 'd': [{'b': 2, 'c': 5}, {'b': 3, 'c': 5}]}](为了便于阅读,输出稍微漂亮一点)

繁花不似锦

使用 Pandas 进行查询的替代解决方案。import pandas as pdsample = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':4}, {'a':2, 'b':2, 'c':5}, {'a':2, 'b':3, 'c':5}]df=pd.DataFrame(sample)这将使用上面的示例列表创建一个 DataFrame df。下一步是遍历 GroupBy 对象并根据需要创建输出。final_list=[]for i, temp_df in df.groupby('a'):    temp_list=[]    for j in temp_df.index:        temp_list.append({'b':temp_df.loc[:,'b'][j],'c':temp_df.loc[:,'c'][j]})    final_list.append({'a':temp_df.loc[:,'a'][j],'d':temp_list})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python