Python中合并和删除重复id的最快方法

2024-10-04 05:25:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同的查询集,我需要合并在一起,然后删除任何重复的ID。有超过一百万张唱片。你知道吗

list_a = Wharehouse.orders.all().values_list('id', flat=True)
list_b = Shops.orders.all().values_list('id', flat=True)

有没有快速的Python方法?你知道吗

我可以考虑使用列表理解和循环每个值。但是,这可以在numpy中更好/更快地完成,或者是一套?输出只需要是一个ID列表。你知道吗

我使用的是安装了numpy1.11.0pip的python3.4和Django。你知道吗


Tags: django方法numpyidtrue列表alllist
3条回答

假设list_alist_b是整数列表,您可以使用np.union1d(list_a, list_b)。使用:

import numpy as np
N = 10**6
list_a = np.random.randint(2*10**6, size=N).tolist()
list_b = np.random.randint(2*10**6, size=N).tolist()

下面是一个基准测试,它表明^{}在应用于包含大约一百万个元素的列表时可能会更快:

In [32]: %timeit np.union1d(list_a, list_b)
1 loop, best of 3: 296 ms per loop

In [40]: %timeit set(list_a + list_b)
1 loop, best of 3: 308 ms per loop

In [31]: %timeit set(list_a).union(list_b)
1 loop, best of 3: 338 ms per loop

In [33]: %timeit list(set(list_a + list_b))
1 loop, best of 3: 382 ms per loop

当然,请注意,np.union1d返回一个NumPy数组,而setlist返回同名类型的Python对象,因此基准测试在某种程度上是一个苹果到橙色的比较。你知道吗

一种方法是使用^{}.

我们创建了2个集合set_aset_bset_a包含Wharehouse对象的所有ID。set_b包含所有ShopsID。现在要合并所有唯一的id,我们对集合使用union操作。final_set包含所有所需的唯一ID。你知道吗

set_a = set(Wharehouse.orders.all().values_list('id', flat=True))
set_b = set(Shops.orders.all().values_list('id', flat=True))

final_set = set_a.union(set_b) # contains all unique ids combined 

尝试将其强制转换为set以删除重复项。然后可以将其返回到列表中。要串联列表,请使用+运算符。它可以做到这一点(至少在普通列表中)

merged = list(set(list_a + list_b))

相关问题 更多 >