在Python中检查两个长列表中的重叠项

3

我有两个列表(list1和list2),它们包含1000万家公司的名称。每个列表中都没有重复项,但是有些公司在两个列表中都出现了。我想找到这些公司。我编写了以下代码:

list_matched = []
for i in range(len(list1)):
    for j in range(len(list2)):
        if list1[i] == list2[j]:
            list_matched.append(list1[i])

这段代码的问题在于它永远不会停止执行。 我的问题是,在合理的时间内完成这项任务,我该怎么做。 看来处理1000万个名称的大小似乎太大了。

这些列表是否偶然已经排序了? - kojiro
2个回答

7

使用集合逻辑。它是专门为这个任务设计的。

a = set(list1)
b = set(list2)

companies_in_both = a & b

(这将生成一个set作为输出。如果您需要它作为列表,只需将set传递给list()。)

请注意,如果您一开始就可以将它们创建为集合而不是将列表转换为集合,那么速度应该会更快。 - porglezomp
@porglezomp 你是如何创建一个集合的呢?这些数据可能来自API、数据库或平面文件... - kojiro
如果数据来自一个平面文件,那么在构建集合时,您应该使用.add而不是.append来添加元素。 - porglezomp

3

我建议从一个列表中创建一组并检查另一个列表,例如:

inlist1 = set(list1)
list_matched = [x for x in list2 if x in inlist1]

当然,您也可以选择另一种方式,具体取决于您想要保留哪个列表的顺序(如果有的话) - 这段代码将保留list2的顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接