我有~3000项的清单。我们称之为listA
。
另有一份包含1,000,000件物品的清单。我们称之为listB
。
我想查看listA
中有多少listB
项属于436
。例如,获得with your_cte as (
select isnull(Liefertermin, FreiesDatum1) as SortDate
from beleg
)
select * from your_cte order by SortDate
之类的答案。
显而易见的方法是使用嵌套循环查找每个项目,但这很慢,特别是由于列表的大小。
获取一个列表中属于另一个列表的项目的最快和/或Pythonic方法是什么?
答案 0 :(得分:7)
制作一套list_b
。这将避免嵌套循环并进行包含检查O(1)
。整个过程将是O(M+N)
,这应该是相当优化的:
set_b = set(list_b)
count = sum(1 for a in list_a if a in set_b)
# OR shorter, but maybe less intuitive
count = sum(a in set_b for a in list_a)
# where the bool expression is coerced to int {0; 1} for the summing
如果你不想(或不得)计算list_a
中重复的元素,你可以使用set intersection:
count = len(set(list_a) & set(list_b))
# OR
count = len(set(list_a).intersection(list_b)) # avoids one conversion
还应注意,这些基于集合的操作仅在列表中的项目可以清除时才有效(例如,不是列表本身)!
答案 1 :(得分:2)
另一种选择是使用set
并找到交叉点:
len(set(listA).intersection(listB))
答案 2 :(得分:0)
您可以遍历listA
的内容并使用生成器来提高值,从而提高效率:
def get_number_of_elements(s, a):
for i in s:
if i in a:
yield i
print(len(list(get_number_of_elements(listA, listB))))