Python 查找哪些列表共享元素的更快方法

Python 查找哪些列表共享元素的更快方法,python,pandas,Python,Pandas,我有一个形状为(142000,1)的数据框,其中有一个名为keywords的列,其中每个单元格都包含一个关键字列表 我想检查哪些行至少有一个相等的关键字 for i in combinations(list(range(len(df.index))), 2): if set(df['keywords'][i[0]]) & set(df['keywords'][i[1]]): do_something() # this runs reasonably fast, n

我有一个形状为(142000,1)的数据框,其中有一个名为keywords的列,其中每个单元格都包含一个关键字列表

我想检查哪些行至少有一个相等的关键字

for i in combinations(list(range(len(df.index))), 2):
    if set(df['keywords'][i[0]]) & set(df['keywords'][i[1]]):
        do_something() # this runs reasonably fast, no problem here
set的工作原理如下:
set([1,2,3])&set([3,4,5])={3}
。因此,实际上只是检查列表是否共享任何项目

问题是,我们有142000人,所以我们要残酷对待它/总共[(142000-2)!2!]次迭代


有更好的方法吗?

创建一个索引,从关键字到该关键字出现的一组所有索引(我不太熟悉Pandas,所以您可能需要解决一些问题):

然后循环浏览索引,并对出现在多个索引中的所有关键字执行某些操作:

for keyword, indices in keyword_index.items():
    if len(indices) >= 2:
        do_something()

您必须决定如何处理出现在两行以上的关键字。如果您想单独处理每个组合,它仍然是原始代码中最糟糕的O(n^2)。

关键字列表有多长?结果是否需要一个成对的列表,或者如何使用它?因此,您基本上有一个列表列表,并且想知道这些子列表中的哪些至少有一个共同的关键字?如果是这样的话,在O(n)中肯定是可行的。@Ry-列表的长度都是100。从结果来看,我将使用I[0]和I[1]。
set.issubset
将起作用,请参见是的,但例如,如果它们全部相交,则仍然有142000×141999对。您在处理配对时是否特别需要配对格式?(或者这种事情对您正在处理的数据来说不是问题,也没有必要担心恶意数据?)
for keyword, indices in keyword_index.items():
    if len(indices) >= 2:
        do_something()