This topic created in 2520 days ago, the information mentioned may be changed or developed.
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 一样的连接功能?
感觉用遍历挨个拼接很蠢,求解决办法
10 replies • 2019-07-15 15:42:39 +08:00
 |
|
1
Takamine Jul 15, 2019 2
# 我记得世界上最好的语言有处理这个的函数,不知道 Py 有没有。 # 这个办法好像也很蠢:doge:。 ```python list3 = [] for i, j in zip(list1, list2): i.update(j) list3.append(i) ```
|
 |
|
3
rrfeng Jul 15, 2019 via Android 1
按 id ?那把 id 当 key 扔字典里,遍历一遍 update 就行了呗
|
 |
|
4
rrfeng Jul 15, 2019 via Android
然后再整成 list。或者直接用 list,id 当索引(范围可控的话,不可控就存个 id 到 list 的索引)
不会比 pandas 差。
|
 |
|
5
starsriver Jul 15, 2019 via Android 1
定义 namebuff 和 agebuff 一维数组,用 id 作为序号索引。更新数据只需要把提取的 list 组合进去就好
|
 |
|
6
txy3000 Jul 15, 2019 1
直接上代码 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())
|
 |
|
7
lance86 Jul 15, 2019 1
用列表推导式?不过其实也是嵌套的 for 循环,, [{'id': item1['id'], 'name': item1['name'], 'age': item2['age']} for item1 in list1 for item2 in list2 if item1['id'] == item2['id']]
|
 |
|
8
goofool Jul 15, 2019
print(list1, list2) list3 = copy.copy(list1) [x[0].update(x[1]) for x in zip(list3, list2)] print(list3)
|
 |
|
9
rrfeng Jul 15, 2019
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++
|
 |
|
10
princelai Jul 15, 2019 1
``` pd.merge(left=pd.DataFrame(list1), right=pd.DataFrame(list2),left_on='id', right_on='id').to_dict('records') ```
|