列表内字典组合问题 求助

2019-07-15 11:52:25 +08:00
 334862132
list1 = [{'id':1,'name':'one'},{'id':2,'name':'two'}]
list2 = [{'id':1,'age':18},{'id':2,'age':17}]

list3 = [{'id':1,'name':'one','age':18},{'id':2,'name':'two','age':17}]
我现在想通过 list1 和 list2 获取 list3 最好的办法是什么
有没有像 mysql 一样的连接功能?
感觉用遍历挨个拼接很蠢,求解决办法
1592 次点击
所在节点    Python
10 条回复
Takamine
2019-07-15 12:08:11 +08:00
# 我记得世界上最好的语言有处理这个的函数,不知道 Py 有没有。
# 这个办法好像也很蠢:doge:。
```python
list3 = []
for i, j in zip(list1, list2):
i.update(j)
list3.append(i)
```
334862132
2019-07-15 12:12:14 +08:00
@Takamine 听朋友说 pandas 里面好像有处理这种数据的方法 这在找。。。。
rrfeng
2019-07-15 12:13:33 +08:00
按 id ?那把 id 当 key 扔字典里,遍历一遍 update 就行了呗
rrfeng
2019-07-15 12:15:38 +08:00
然后再整成 list。或者直接用 list,id 当索引(范围可控的话,不可控就存个 id 到 list 的索引)

不会比 pandas 差。
starsriver
2019-07-15 12:40:38 +08:00
定义 namebuff 和 agebuff 一维数组,用 id 作为序号索引。更新数据只需要把提取的 list 组合进去就好
txy3000
2019-07-15 12:44:53 +08:00
直接上代码
def func(l): return {e['id']: e for e in l}
l1 = [{'id': 1, 'name': 'one'}, {'id': 2, 'name': 'two'}]
l2 = [{'id': 1, 'age': 18}, {'id': 2, 'age': 17}]

d1, d2 = func(l1), func(l2)

l3 = list(dict(d1[i].items() | d2[i].items())
for i in d1.keys() & d2.keys())
lance86
2019-07-15 12:54:24 +08:00
用列表推导式?不过其实也是嵌套的 for 循环,,
[{'id': item1['id'], 'name': item1['name'], 'age': item2['age']} for item1 in list1 for item2 in list2 if item1['id'] == item2['id']]
goofool
2019-07-15 13:57:39 +08:00
print(list1, list2)
list3 = copy.copy(list1)
[x[0].update(x[1]) for x in zip(list3, list2)]
print(list3)
rrfeng
2019-07-15 14:13:10 +08:00
result = []
index = {}
c = 0

for i in list1+list2:
index[i['id']] = c
if not resut[c]:
result[c] = i
else:
result[c].update(i)
c++
princelai
2019-07-15 15:42:39 +08:00
```
pd.merge(left=pd.DataFrame(list1), right=pd.DataFrame(list2),left_on='id', right_on='id').to_dict('records')
```

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

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

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

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

© 2021 V2EX