
需求是将两个列表合并,如果 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 Aug 13, 2021 |
2 no1xsyzy Aug 13, 2021 [*{**{t['id']:t for t in err_data}, **{t['id']:t for t in new_data}}.values()] |
3 yuruizhe Aug 13, 2021 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 Aug 13, 2021 result = new_data + [x for x in err_data if x['id'] not in {d['id'] for d in new_data}] |
5 strict Aug 13, 2021 ChainMap(new_data, err_data) 这样不是更 pythonnic 一点么. |
7 Macv1994 OP |
8 YsHaNg Aug 14, 2021 @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 Aug 14, 2021 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 Aug 14, 2021 等等,你这是列表啊,那先把 err_data 和 new_data 转为字典吧,`id`做键,`data`做值。 |
11 lixiang2017 Aug 15, 2021 via Android 四楼是对的 |