python - 比较两个列表以获取不匹配的元素
问题描述
我检查了这个比较列表,只有一个答案与我正在尝试做的事情有关。我必须列出一些类似的元素,我想得到不匹配的元素。
len(h) = 1973182 #h[0] = 'B00006J8F4F2', y[0] = 'B0075Y2X2GO6'
len(y) = 656890
我在做
new_list = [i for i in h if i not in y]
,但是这需要大约 13 分钟,有没有更快的方法呢?
在参考“重复”问题,查找不在列表中的元素时,我使用相同的代码,我正在寻找的是一种更快的方法。
解决方案
您可以使用它sets
来更有效地找出两个列表之间的差异。如果您需要将订单保留在原始列表中,您可以sorted
使用key
.
我们想根据它们在原始列表中的外观对集合中的元素进行排序,因此一种方法是构建查找字典。我们可以使用enumerate
它。然后我们只需要在字典上查找一个key
函数:
d = {j:i for i,j in enumerate(h)}
new_list = sorted(list((set(h) - set(y))), key = lambda x: d[x])
让我们尝试一个简单的例子:
y = range(5)
h = range(7)
d = {j:i for i,j in enumerate(h)}
sorted(list((set(h) - set(y))), key = lambda x: d[x])
# [5, 6]
计时 -
import random
y = random.sample(range(1, 10001), 10000)
h = random.sample(range(1, 20001), 10000)
%timeit [i for i in h if i not in y]
# 1.28 s ± 37.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
def using_sets(a,b):
d = {j:i for i,j in enumerate(a)}
sorted(list((set(a) - set(b))), key = lambda x: d[x])
%timeit using_sets(h,y)
# 6.16 ms ± 373 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
因此,有了明显的改进,所提出的方法的执行速度提高了 200 倍。
推荐阅读
- r - RShiny selectInput没有正确过滤renderPlot的数据
- dictionary - 什么数据结构可以用来支持外键约束
- java - Apache Flink:自定义触发器行为异常
- kotlin - 对于 kotlin 和 arrow-kt 库的理解
- ruby - pg gem 中 SSL 支持的运行时检测
- odoo - 检索同一张表的多个ID
- python - 带有 db_index=False 的 Django OneToOneField 与 OneToOneField
- fiware - FIWARE Orion Docker 容器:通知订阅中的问题
- java - Spark 框架 cookie 始终为空
- java - 当软键盘在android中显示时edittext在错误的位置