Python:检查大列表中的项是否不在另一个大列表中有什么更快的方法



我有两个列表:

  • old_data的长度为180000
  • updated_data的长度为184000
  • 这两个列表都包含字符串值的ID
  • 存储在列表中的ID有很多重叠,但我需要知道哪些ID不再存储在updated_data中,这样我就可以说这些ID在SQL server中不再活动

因此,我需要检查old_data中不在updated_data的任何项目,并将它们保存到一个单独的列表中,我们称之为inactive_data。

我目前有以下代码,这是非常耗时和低效的:

# Initialize list for no-longer active IDs to be saved into.
inactive_data = []
# Iteratively check if all IDs in old data are still in updated data.
# If they are not, add them to the list.
for Id in old_data:

if Id not in updated_data:

inactive_data.append(Id)

要运行此代码,大约需要45分钟。我想知道怎样才能大大减少时间。如果你有什么建议,请告诉我!

通常简单的方法是将一个或两个list转换为set

另一种方法是对两个列表进行排序,并逐元素进行比较。一旦它们被排序,比较就很快,因为它是O(n(。

诀窍是使用set((、sortedcontainers,然后使用set操作来进行diff。如果您的数据集更复杂,您可能需要使用dict对id进行索引,然后使用一组键。

# from sortedcontainers import SortedSet, SortedDict
old_data      = set(map(str,range(180000)))
updated_data  = set(map(str,range(184000)))
inactive_data = updated_data - old_data
active_data   = updated_data & old_data
print("inactive_data: ", len(inactive_data), set(list(inactive_data)[0:10]))
print("active_data:   ", len(active_data),   set(list(active_data)[0:10]))
inactive_data:    4000 {'181439', '181023', '183834', '180575', '182003', '183226', '180134', '183697', '181968', '181804'}
active_data:    180000 {'54276', '128822', '91802', '8678', '118826', '97510', '22786', '30341', '88711', '137764'}
time 0.609s
  • 注意:已排序的容器。SortedSet的速度是无序集((的一半

相关内容

  • 没有找到相关文章

最新更新