Python 列表中的字典::合并相同键的值

Python 列表中的字典::合并相同键的值,python,data-structures,data-dictionary,Python,Data Structures,Data Dictionary,我在Python列表中有多个字典,如下所示 [{"color": "#CC3", "values": {"y": 83, "x": 9}, "key": 105}, {"color": "#CC3", "values": {"y": 123, "x": 10}, "key": 105}, {"color": "#FF9", "values": {"y": 96, "x": 11}, "key": 106}, {"color": "#33F", "values": {"y": 80, "x"

我在Python列表中有多个字典,如下所示

[{"color": "#CC3", "values": {"y": 83, "x": 9}, "key": 105},
 {"color": "#CC3", "values": {"y": 123, "x": 10}, "key": 105},
 {"color": "#FF9", "values": {"y": 96, "x": 11}, "key": 106},
 {"color": "#33F", "values": {"y": 80, "x": 12}, "key": 104},
 {"color": "#CC3", "values": {"y": 117, "x": 13}, "key": 105},
 {"color": "#CC3", "values": {"y": 115, "x": 14}, "key": 105},
 {"color": "#CC3", "values": {"y": 102, "x": 15}, "key": 105},
 {"color": "#FF9", "values": {"y": 111, "x": 16}, "key": 106},
 {"color": "#FF9", "values": {"y": 33, "x": 17}, "key": 106}]
在上面包含字典的列表中,有称为“key”的键,其值相同,例如105、106等。在这些字典中,值的值不同,例如值:{y:83、x:9}和值:{y:117、x:13}表示105

我想在一个字典中添加并带来相同key=xxx字典的值

例如,假设对于key=105的字典,我想聚合如下列表中的值:[{y:83,x:9},{y:117,x:13}]

最终合并产出应保持上述原始结构

[{"color"="...","values"=[{...},{...}],"key"="..."},....]

实现这一目标的最佳方式是什么

试试这样的方法:

dicts = [{...}, {...}]

def get_values(key):
    return [d["values"] for d in dicts if d["key"] == key]

values_for_105 = get_values(105)
对于_105的示例值_:


试着这样做:

dicts = [{...}, {...}]

def get_values(key):
    return [d["values"] for d in dicts if d["key"] == key]

values_for_105 = get_values(105)
对于_105的示例值_:


如果您只想根据一个键对元素进行分组,那么使用itertools.groupby函数,它可以直接执行此操作,而不需要为创建defaultdict实例而产生混乱的开销:

这将产生:

[{100: [{'key': 100, 'x': 10, 'y': 20}, {'key': 100, 'x': 5, 'y': 3.4}]},
 {200: [{'key': 200, 'x': 44, 'y': 3.14}, {'key': 200, 'x': -44, 'y': 3.14}]}]
下面是我的测试示例

这是一种更有效的处理方法,因为它将原始密钥保留在dicts中,您可以选择忽略这些密钥,但不受删除它们的限制。。因此,这是较少的损耗,并且b您可以执行下面的分组操作/聚合示例

假设您最初的字典列表称为list_of_dicts,并且您想要一个新的字典列表作为输出,只需将x和y项相加即可

[
 reduce(
        lambda a,b: {"key":a["key"], "x":a["x"]+b["x"], "y":a["y"]+b["y"]},
        list(elem)
       ) 
 for k, elem in itertools.groupby(list_of_dicts, key_func)
]
如果使用以下测试输入运行:

list_of_dicts = [
                 {"key":100, "x":10, "y":20}, 
                 {"key":100, "x":5, "y":3.4}, 
                 {"key":200, "x":44, "y":3.14}, 
                 {"key":200, "x":-44, "y":3.14}
                ]
然后我得到以下结果:

print [reduce(lambda a,b: {"key":a["key"], "x":a["x"]+b["x"], "y":a["y"]+b["y"]}, list(elem)) for k, elem in itertools.groupby(list_of_dicts, key_func)]

[{'key': 100, 'x': 15, 'y': 23.4}, {'key': 200, 'x': 0, 'y': 6.28}]

如果您只想根据一个键对元素进行分组,那么使用itertools.groupby函数,它可以直接执行此操作,而不需要为创建defaultdict实例而产生混乱的开销:

这将产生:

[{100: [{'key': 100, 'x': 10, 'y': 20}, {'key': 100, 'x': 5, 'y': 3.4}]},
 {200: [{'key': 200, 'x': 44, 'y': 3.14}, {'key': 200, 'x': -44, 'y': 3.14}]}]
下面是我的测试示例

这是一种更有效的处理方法,因为它将原始密钥保留在dicts中,您可以选择忽略这些密钥,但不受删除它们的限制。。因此,这是较少的损耗,并且b您可以执行下面的分组操作/聚合示例

假设您最初的字典列表称为list_of_dicts,并且您想要一个新的字典列表作为输出,只需将x和y项相加即可

[
 reduce(
        lambda a,b: {"key":a["key"], "x":a["x"]+b["x"], "y":a["y"]+b["y"]},
        list(elem)
       ) 
 for k, elem in itertools.groupby(list_of_dicts, key_func)
]
如果使用以下测试输入运行:

list_of_dicts = [
                 {"key":100, "x":10, "y":20}, 
                 {"key":100, "x":5, "y":3.4}, 
                 {"key":200, "x":44, "y":3.14}, 
                 {"key":200, "x":-44, "y":3.14}
                ]
然后我得到以下结果:

print [reduce(lambda a,b: {"key":a["key"], "x":a["x"]+b["x"], "y":a["y"]+b["y"]}, list(elem)) for k, elem in itertools.groupby(list_of_dicts, key_func)]

[{'key': 100, 'x': 15, 'y': 23.4}, {'key': 200, 'x': 0, 'y': 6.28}]
你可以用一个

若您向其提供列表,则当访问新密钥时,它将自动创建空列表

from collections import defaultdict

a = [{"color": "#CC3", "values": {"y": 83, "x": 9}, "key": 105}, {"color": "#CC3", "values": {"y": 123, "x": 10}, "key": 105}, {"color": "#FF9", "values": {"y": 96, "x": 11}, "key": 106}, {"color": "#33F", "values": {"y": 80, "x": 12}, "key": 104}, {"color": "#CC3", "values": {"y": 117, "x": 13}, "key": 105}, {"color": "#CC3", "values": {"y": 115, "x": 14}, "key": 105}, {"color": "#CC3", "values": {"y": 102, "x": 15}, "key": 105}, {"color": "#FF9", "values": {"y": 111, "x": 16}, "key": 106}, {"color": "#FF9", "values": {"y": 33, "x": 17}, "key": 106}]

result = defaultdict(list)

for d in a:
    result[d['key']].append(d['values'])
现在的结果是:

你可以用一个

若您向其提供列表,则当访问新密钥时,它将自动创建空列表

from collections import defaultdict

a = [{"color": "#CC3", "values": {"y": 83, "x": 9}, "key": 105}, {"color": "#CC3", "values": {"y": 123, "x": 10}, "key": 105}, {"color": "#FF9", "values": {"y": 96, "x": 11}, "key": 106}, {"color": "#33F", "values": {"y": 80, "x": 12}, "key": 104}, {"color": "#CC3", "values": {"y": 117, "x": 13}, "key": 105}, {"color": "#CC3", "values": {"y": 115, "x": 14}, "key": 105}, {"color": "#CC3", "values": {"y": 102, "x": 15}, "key": 105}, {"color": "#FF9", "values": {"y": 111, "x": 16}, "key": 106}, {"color": "#FF9", "values": {"y": 33, "x": 17}, "key": 106}]

result = defaultdict(list)

for d in a:
    result[d['key']].append(d['values'])
现在的结果是:

databykey现在是

databykey现在是


正如你所看到的,这不是真的。如果你真的想让我们看到你的问题的格式,你必须小心一些-谢谢你的指点,我希望我现在已经把它框好了!正如你所看到的,这不是真的。如果你真的想让我们看到你的问题的格式,你必须小心一些-谢谢你的指点,我希望我现在已经把它框好了!我也用这个,但有两点。首先,itertools.groupby要求元素按键排序,即100需要在一起,这有时会造成麻烦。第二,defaultdict方法根本不需要有损—只需附加dict本身,而不是d[values]。groupby不需要任何排序。你只需要传递一个函数,提取你想要的任何键。random.shuffle你的dicts列表,看看输出,看看我的意思。我也用这个,但有两点。首先,itertools.groupby要求元素按键排序,即100需要在一起,这有时会造成麻烦。第二,defaultdict方法根本不需要有损—只需附加dict本身,而不是d[values]。groupby不需要任何排序。你只需要传递一个函数,它可以提取你想要的任何键。random.shuffle你的dicts列表,看看输出,看看我的意思。我想保持输出结构与我的问题中引用的原始结构相同,唯一的区别是,这些值是为类似的字典添加的。我想保持输出结构与我的问题中引用的原始结构相同,唯一的区别是,这些值是为类似的字典添加的