需求是将两个列表合并,如果 err_data 中的 id 与 new_data 中的 id 重复,那么就把 err_data 中的项去掉,各位彦祖,合并后的顺序无所谓,求一个较好的方法。
err_data = [
{'id': 1, 'data': 23},
{'id': 2, 'data': 24},
{'id': 3, 'data': 25},
{'id': 4, 'data': 222},
{'id': 5, 'data': 134},
{'id': 6, 'data': 255}
]
new_data = [
{'id': 1, 'data': 345},
{'id': 2, 'data': 124},
{'id': 28, 'data': 124},
{'id': 29, 'data': 124},
{'id': 30, 'data': 124}
]
# 需求是将两个列表合并,如果 err_data 中的 id 与 new_data 中的 id 重复,那么就把 err_data 中的项去掉,
# new_data + err_data 的结果如下
result = [
{'id': 3, 'data': 25},
{'id': 4, 'data': 222},
{'id': 5, 'data': 134},
{'id': 6, 'data': 255},
{'id': 28, 'data': 124},
{'id': 29, 'data': 124},
{'id': 30, 'data': 124},
{'id': 1, 'data': 345},
{'id': 2, 'data': 124},
]
1
kebyn 2021-08-13 13:41:17 +08:00
|
2
no1xsyzy 2021-08-13 14:10:00 +08:00
[*{**{t['id']:t for t in err_data}, **{t['id']:t for t in new_data}}.values()]
|
3
yuruizhe 2021-08-13 14:29:52 +08:00
from operator import itemgetter
err_data, new_data = {itemgetter('id')(x): itemgetter('data')(x) for x in err_data}, {itemgetter('id')(x): itemgetter('data')(x) for x in new_data} err_data.update(new_data) |
4
wateryessence 2021-08-13 14:42:49 +08:00
result = new_data + [x for x in err_data if x['id'] not in {d['id'] for d in new_data}]
|
5
strict 2021-08-13 14:47:23 +08:00
ChainMap(new_data, err_data)
这样不是更 pythonnic 一点么. |
7
Macv1994 OP |
8
YsHaNg 2021-08-14 05:27:46 +08:00
@Macv1994 err_dic = {item['id']:item['data'] for item in err_data}
new_dic = {item['id']:item['data'] for item in new_data} result_dic = dict(zip(ChainMap(new_dic,err_dic).keys(),ChainMap(new_dic,err_dic).values())) |
9
Pzqqt 2021-08-14 09:08:01 +08:00
python 2 或 python 3.5 以下的版本:
```python result = dict(ChainMap(err_data, new_data)) ``` python 3.5 及以上版本: ```python result = {**err_data, **new_data} ``` python 3.9 及以上版本: ```python result = err_data | new_data ``` |
10
Pzqqt 2021-08-14 09:10:37 +08:00
等等,你这是列表啊,那先把 err_data 和 new_data 转为字典吧,`id`做键,`data`做值。
|
11
lixiang2017 2021-08-15 03:15:55 +08:00 via Android
四楼是对的
|