关于字典的操作,求一个较好的解决方案

2021-08-13 12:32:33 +08:00
 Macv1994

需求是将两个列表合并,如果 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},
]

2112 次点击
所在节点    Python
11 条回复
kebyn
2021-08-13 13:41:17 +08:00
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()]
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)
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}]
strict
2021-08-13 14:47:23 +08:00
ChainMap(new_data, err_data)


这样不是更 pythonnic 一点么.
Macv1994
2021-08-13 14:54:16 +08:00
@strict 我试试看 谢谢啊
Macv1994
2021-08-13 14:54:29 +08:00
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()))
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
```
Pzqqt
2021-08-14 09:10:37 +08:00
等等,你这是列表啊,那先把 err_data 和 new_data 转为字典吧,`id`做键,`data`做值。
lixiang2017
2021-08-15 03:15:55 +08:00
四楼是对的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/795547

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX