从一大组python列表中,找到两个具有最多共同元素的列表—python/Pandas

从一大组python列表中,找到两个具有最多共同元素的列表—python/Pandas,python,pandas,dataframe,csv,Python,Pandas,Dataframe,Csv,问题: list1 = [234, 982, 908, 207, 456, 284, 473] list2 = [845, 345, 765, 678] list3 = [120, 542, 764, 908, 217, 778, 999, 326, 456] # thousands more lists ... # 2 most similar lists: list400, list6734 我有许多不同长度的python列表,都只包含整数 我如何找到两个具有最多共同元素的列表 输入

问题:

list1 = [234, 982, 908, 207, 456, 284, 473]
list2 = [845, 345, 765, 678]
list3 = [120, 542, 764, 908, 217, 778, 999, 326, 456]

# thousands more lists ...
# 2 most similar lists:

list400, list6734
我有许多不同长度的python列表,都只包含整数

我如何找到两个具有最多共同元素的列表

输入示例:

list1 = [234, 982, 908, 207, 456, 284, 473]
list2 = [845, 345, 765, 678]
list3 = [120, 542, 764, 908, 217, 778, 999, 326, 456]

# thousands more lists ...
# 2 most similar lists:

list400, list6734
示例输出:

list1 = [234, 982, 908, 207, 456, 284, 473]
list2 = [845, 345, 765, 678]
list3 = [120, 542, 764, 908, 217, 778, 999, 326, 456]

# thousands more lists ...
# 2 most similar lists:

list400, list6734
注意: 我不想在列表中找到最常见的元素,只想找到最相似的两个列表,即具有最多共同元素。我也不关心单个元素的相似性。元素可以在两个列表中找到,也可以不在其中

上下文:

list1 = [234, 982, 908, 207, 456, 284, 473]
list2 = [845, 345, 765, 678]
list3 = [120, 542, 764, 908, 217, 778, 999, 326, 456]

# thousands more lists ...
# 2 most similar lists:

list400, list6734
我有一个数据集,表示哪些用户喜欢某个平台上的某些帖子。如果两个用户都喜欢同一篇文章,那么他们的共同评分为1。如果两个用户喜欢相同帖子中的10篇,那么他们的共同喜欢分数为10。我的目标是找到两个拥有最高的共同爱好分数的用户

我已将数据(来自CSV)加载到pandas数据框中,每一行表示用户和帖子之间的相似之处:

指数 用户id 邮政id 0 201 234 1. 892 908 2. 300 825
由于这些是可变长度的列表,pandas(它喜欢处理大小相同的列)可能不是最好的工具。在纯python中,您可以将这些列表转换为集合,然后使用集合交集计数来查找大多数公共项。这对于集合来说是最常见的,如果列表包含同一整数的多个副本,则集合可能不同于列表

我提出的代码有点复杂,因为它只对集合进行一次中间转换。但我认为它是可读的。。。(我希望如此)


由于您只关心公共元素的数量,因此可以创建虚拟对象,然后使用点积获得所有用户比较的共享元素数量。然后我们找到最大值

样本数据 代码
这似乎是图论的完美应用。如果我们将每个用户和帖子想象成一个节点,并将每个用户连接到他们喜欢的帖子上,我们可以在图上应用变换,得到一个矩阵,该矩阵一次显示所有用户的
common\u like\u得分。在这一点上,获得最高分数的一对应该是微不足道的

“求图中两个节点之间的n长路径数”是图论中一个众所周知且已解决的问题

以下是一些很好的参考链接,以了解更多有关该理论的信息:

  • 基本上,如果您将这些数据表示为一个邻接矩阵,那么您可以将该矩阵平方以获得每个用户的喜爱度得分

    以下是我的实现:

    import numpy as np
    
    #Create an adjacency matrix
    users = df["user id"].unique()
    combined = np.concatenate((users, df["post id"].unique()), axis=0)
    combined_dict = dict()
    i = 0
    for c in combined:
        combined_dict[c] = i
        i += 1
    
    n = len(combined)-1
    M = np.zeros((n+1, n+1))
    
    for pair in df.itertuples():
        M[combined_dict[pair._1], combined_dict[pair._2]] = 1
        M[combined_dict[pair._2], combined_dict[pair._1]] = 1
    M = np.asmatrix(M)
    
    
    #Square the matrix to get scores of all users
    scores = M*M
    
    #Slice matrix to only include users
    user_count = len(users)
    scores = scores[0:user_count, 0:user_count]
    
    #Remove paths between same user
    for i in range(user_count):
        scores[i, i] = 0
    
    print(scores)
    
    运行此操作将生成一个如下所示的矩阵(不带用户标签):

    用户1 用户2 用户3 用户4 用户1 0 2 1. 0 用户2 2 0 1. 1. 用户3 1. 1. 0 0 用户4 0 1. 0 0
    Pandas可能不是执行此计算的最佳库。相反,我建议您将所有数据转换为集合,获得每对集合的并集,并找到最大的并集。谢谢@AndrewMascillaro,您能分享一个如何在实践中实现这一点的示例吗?请参阅@tdelaney的实施方案每当我想到社交媒体时,我总是想到图论。具体地说,问题在于找到两点之间n长度的路径数。我在下面发布了自己的解决方案,但可能还有其他更快的解决方案可以供您查看。同样值得一提的是,如果您不想自己编写所有代码,您可以使用NetworkX之类的库来完成这项工作。