我有2个词典列表。
list1 = [{'user_id':23, 'user_name':'John', 'age':30},
{'user_id':24, 'user_name':'Shaun', 'age':31},
{'user_id':25, 'user_name':'Johny', 'age':32}]
list2 =[{'user_id':23},
{'user_id':25}]
现在我想要输出
list3 = [{'user_id':23, 'user_name':'John', 'age':30},
{'user_id':25, 'user_name':'Johny','age':32}]
我想要最有效的方式,因为我的list1
可能包含数百万行。
答案 0 :(得分:5)
您必须稍微转换list2
以获得快速查找。我从中做出set
list1 = [{'user_id':23, 'user_name':'John','age':30},
{'user_id':24, 'user_name':'Shaun','age':31},
{'user_id':25, 'user_name':'Johny','age':32}]
list2 =[{'user_id':23},
{'user_id':25}]
list2_ids = {d['user_id'] for d in list2}
然后使用筛选列表解析构建list3
。在这种情况下,in list2_ids
非常快,因为它使用set
中的查找而非线性搜索:
list3 = [x for x in list1 if x['user_id'] in list2_ids]
print(list3)
结果:
[{'user_id': 23, 'user_name': 'John', 'age': 30}, {'user_id': 25, 'user_name': 'Johny', 'age': 32}]
答案 1 :(得分:1)
当密钥为list1
且值为user_id
和name
时,我会将您的age
转换为字典。
现在,当您查看此dict
时,即使dict
包含大量元素,复杂度为O(1)
也适用于查找。
在这种情况下,查找所有用户ID的完整复杂性为O(len(list2))
dict1 = {23 : {'user_name':'John', 'age':30},
24 : {'user_name':'Shaun', 'age':31},
25 : {'user_name':'Johny', 'age':32}}
list2 =[{'user_id':23},
{'user_id':25}]
res = [dict1.get(user['user_id']) for user in list2 if user['user_id'] in dict1]
print (res)
>>> [{'user_name': 'John', 'age': 30}, {'user_name': 'Johny', 'age': 32}]
答案 2 :(得分:0)
您可以使用pandas将数据框合并到一起。
1.将dict转换为数据帧
2.合并两个数据帧" user_id"
import pandas as pd
list1 = [{'user_id':23, 'user_name':'John', 'age':30},
{'user_id':24, 'user_name':'Shaun', 'age':31},
{'user_id':25, 'user_name':'Johny', 'age':32}]
list2 =[{'user_id':23},
{'user_id':25}]
df1 = pd.DataFrame(list1)
df1
age user_id user_name
0 30 23 John
1 31 24 Shaun
2 32 25 Johny
df2 = pd.DataFrame(list2)
df2
user_id
0 23
1 25
pd.merge(df2,df1,on='user_id')
user_id age user_name
0 23 30 John
1 25 32 Johny
答案 3 :(得分:0)
与之前的海报一样,您需要创建列表2中的ID列表:
list2_ids = {d['user_id'] for d in list2}
完成此操作后,您还可以使用过滤功能:
filter(lambda x: x['user_id'] in list2_ids, list1)
虽然没有进行优化,但它具有多个并行计算实现的好处(如果您正在处理大量数据,则可能需要这些实现。
据说,性能方面的最佳解决方案可能是设置交集(comparison):
unique_ids = set([d['user_id'] for d in list1]) & set([d['user_id'] for d in list2])
list3 = [x for x in list1 if x['user_id'] in unique_ids]
如果您确定列表不包含重复项,则可以忽略 set 。