聚合字典列表的有效方法
An efficient way to aggregate list of dictionaries
我有一个 python 词典的列表,我正在尝试根据不同的指标(最大值、最小值)聚合键。
现在,我正在将字典列表转换为 pandas
数据框,然后使用 agg
函数 return 我想要的输出。
但是这样做会消耗一些时间和内存。希望能在不诉诸 pandas.
的情况下提高 运行 时间的效率
到目前为止我做了什么?
boxes = [{'width': 178.25, 'right': 273.25, 'top': 535.0, 'left': 95.0, 'bottom': 549.0, 'height': 14.0}, {'width': 11.17578125, 'right': 87.17578125, 'top': 521.0, 'left': 76.0, 'bottom': 535.0, 'height': 14.0}, {'width': 230.8515625, 'right': 306.8515625, 'top': 492.0, 'left': 76.0, 'bottom': 506.0, 'height': 14.0}, {'width': 14.65234375, 'right': 90.65234375, 'top': 535.0, 'left': 76.0, 'bottom': 549.0, 'height': 14.0}, {'width': 7.703125, 'right': 83.703125, 'top': 506.0, 'left': 76.0, 'bottom': 520.0, 'height': 14.0}, {'width': 181.8515625, 'right': 276.8515625, 'top': 521.0, 'left': 95.0, 'bottom': 535.0, 'height': 14.0}, {'width': 211.25, 'right': 306.25, 'top': 506.0, 'left': 95.0, 'bottom': 520.0, 'height': 14.0}]
boxes = pd.DataFrame(boxes)
boxes = boxes.agg({'left': min, 'right': max, 'top': min, 'bottom': max})
boxes['height'] = boxes['bottom'] - boxes['top']
boxes['width'] = boxes['right'] - boxes['left']
res = boxes.to_dict()
想要的结果
{'left': 76.0, 'right': 306.8515625, 'top': 492.0, 'bottom': 549.0, 'height': 57.0, 'width': 230.8515625}
这是一种方法:
(i) 使用 dict.setdefault
合并词典以创建一个词典 temp
(ii) 遍历 temp
并将 functions
中的函数应用于相应键的值。
(iii) 'height' 和 'width' 不在 functions
中。分别计算。
functions = {'left': min, 'right': max, 'top': min, 'bottom': max}
temp = {}
for d in boxes:
for k, v in d.items():
if k in functions:
temp.setdefault(k, []).append(v)
out = {k: functions[k](v) for k, v in temp.items()}
out['height'] = out['bottom'] - out['top']
out['width'] = out['right'] - out['left']
输出:
{'width': 230.8515625,
'right': 306.8515625,
'top': 492.0,
'left': 76.0,
'bottom': 549.0,
'height': 57.0}
我有一个 python 词典的列表,我正在尝试根据不同的指标(最大值、最小值)聚合键。
现在,我正在将字典列表转换为 pandas
数据框,然后使用 agg
函数 return 我想要的输出。
但是这样做会消耗一些时间和内存。希望能在不诉诸 pandas.
的情况下提高 运行 时间的效率到目前为止我做了什么?
boxes = [{'width': 178.25, 'right': 273.25, 'top': 535.0, 'left': 95.0, 'bottom': 549.0, 'height': 14.0}, {'width': 11.17578125, 'right': 87.17578125, 'top': 521.0, 'left': 76.0, 'bottom': 535.0, 'height': 14.0}, {'width': 230.8515625, 'right': 306.8515625, 'top': 492.0, 'left': 76.0, 'bottom': 506.0, 'height': 14.0}, {'width': 14.65234375, 'right': 90.65234375, 'top': 535.0, 'left': 76.0, 'bottom': 549.0, 'height': 14.0}, {'width': 7.703125, 'right': 83.703125, 'top': 506.0, 'left': 76.0, 'bottom': 520.0, 'height': 14.0}, {'width': 181.8515625, 'right': 276.8515625, 'top': 521.0, 'left': 95.0, 'bottom': 535.0, 'height': 14.0}, {'width': 211.25, 'right': 306.25, 'top': 506.0, 'left': 95.0, 'bottom': 520.0, 'height': 14.0}]
boxes = pd.DataFrame(boxes)
boxes = boxes.agg({'left': min, 'right': max, 'top': min, 'bottom': max})
boxes['height'] = boxes['bottom'] - boxes['top']
boxes['width'] = boxes['right'] - boxes['left']
res = boxes.to_dict()
想要的结果
{'left': 76.0, 'right': 306.8515625, 'top': 492.0, 'bottom': 549.0, 'height': 57.0, 'width': 230.8515625}
这是一种方法:
(i) 使用 dict.setdefault
合并词典以创建一个词典 temp
(ii) 遍历 temp
并将 functions
中的函数应用于相应键的值。
(iii) 'height' 和 'width' 不在 functions
中。分别计算。
functions = {'left': min, 'right': max, 'top': min, 'bottom': max}
temp = {}
for d in boxes:
for k, v in d.items():
if k in functions:
temp.setdefault(k, []).append(v)
out = {k: functions[k](v) for k, v in temp.items()}
out['height'] = out['bottom'] - out['top']
out['width'] = out['right'] - out['left']
输出:
{'width': 230.8515625,
'right': 306.8515625,
'top': 492.0,
'left': 76.0,
'bottom': 549.0,
'height': 57.0}