Python:如何获取一个属于另一个列表的项目数

时间:2017-09-25 12:51:47

标签: python python-3.x list

我有~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方法是什么?

3 个答案:

答案 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))))