Python 列表中的字典::合并相同键的值
我在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"
[{"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列表,看看输出,看看我的意思。我想保持输出结构与我的问题中引用的原始结构相同,唯一的区别是,这些值是为类似的字典添加的。我想保持输出结构与我的问题中引用的原始结构相同,唯一的区别是,这些值是为类似的字典添加的