繁体   English   中英

按某个键合并字典列表

[英]merge a list of dicts by a certain key

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

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}]}]

您可以使用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}]}]

注意:如果保证字典列表按 key a的值排序,则不需要sorted

按键组合:

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 pprint
pprint(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 groupby

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}]

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 pd
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}]

df=pd.DataFrame(sample)

这将使用上述示例列表创建 DataFrame df 下一步是遍历 GroupBy Object 并根据需要创建 output。

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})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM