【问题标题】:Rank lists based on their content similarity to the reference list根据与参考列表的内容相似性对列表进行排名
【发布时间】:2017-09-09 10:16:29
【问题描述】:

我有一堆列表,每个列表都有很多string 组件。

我想使用这些列表中的每一个作为参考,并根据它们与参考列表的相似性对其他列表进行排名。

pyp1 = ['yaz', 'vur', 'mir', 'rim', 'kiss', 'pass', 'qash', 'topp', 'goz', 'trs1', 'tsne', 'tkn', 'kaz']

idx1 = ['yaz', 'avur', 'mir', 'riem', 'kiss', 'pass', 'sash', 'zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup']

myc2 = ['ayaz', 'aavur', 'amir', 'ariem', 'miss', 'pass', 'zash', 'zopp', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup', 'avenir']

mik1 = ['yaz', 'avur', 'mir', 'riem', 'kiss','gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'ariem', 'miss', 'pass', 'naz']

zach1 = ['zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'many', 'may1', 'myc2']

假设我使用 pyp1 作为参考,我想根据与参考列表比较的相同字符串的数量对剩余列表 (myc2, mik1, idx1, zach1) 进行排名。

我怎样才能用新功能做到这一点?感谢您的帮助。

【问题讨论】:

    标签: python list function python-3.5


    【解决方案1】:

    如果您尝试按与您的参考匹配的数量对它们进行排名,那么您可以简单地使用集合来计算您的参考列表与其他列表的交集。交点的长度为您提供如下匹配数:

    pyp1 = ['yaz', 'vur', 'mir', 'rim', 'kiss', 'pass', 'qash', 'topp', 'goz', 'trs1', 'tsne', 'tkn', 'kaz']
    idx1 = ['yaz', 'avur', 'mir', 'riem', 'kiss', 'pass', 'sash', 'zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup']
    myc2 = ['ayaz', 'aavur', 'amir', 'ariem', 'miss', 'pass', 'zash', 'zopp', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup', 'avenir']
    mik1 = ['yaz', 'avur', 'mir', 'riem', 'kiss','gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'ariem', 'miss', 'pass', 'naz']
    zach1 = ['zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'many', 'may1', 'myc2']  
    
    def sort_by_matches(ref, lists):
        reference = set(ref)
        lists = [[len(reference.intersection(set(x))), x] for x in lists]
    
        for count, a_list in lists:
            print("Matches {} in {}".format(count, a_list))
    
    sort_by_matches(pyp1, [idx1, myc2, mik1, zach1])
    

    这将显示:

    Matches 8 in ['yaz', 'avur', 'mir', 'riem', 'kiss', 'pass', 'sash', 'zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup']
    Matches 5 in ['ayaz', 'aavur', 'amir', 'ariem', 'miss', 'pass', 'zash', 'zopp', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup', 'avenir']
    Matches 8 in ['yaz', 'avur', 'mir', 'riem', 'kiss', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'ariem', 'miss', 'pass', 'naz']
    Matches 4 in ['zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'many', 'may1', 'myc2']
    

    如果您希望输出按排名排序,您可以先按匹配数排序,然后按列表长度(最短优先),如示例中,两个条目匹配8。例如

    pyp1 = ['yaz', 'vur', 'mir', 'rim', 'kiss', 'pass', 'qash', 'topp', 'goz', 'trs1', 'tsne', 'tkn', 'kaz']
    idx1 = ['yaz', 'avur', 'mir', 'riem', 'kiss', 'pass', 'sash', 'zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup']
    myc2 = ['ayaz', 'aavur', 'amir', 'ariem', 'miss', 'pass', 'zash', 'zopp', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup', 'avenir']
    mik1 = ['yaz', 'avur', 'mir', 'riem', 'kiss','gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'ariem', 'miss', 'pass', 'naz']
    zach1 = ['zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'many', 'may1', 'myc2']  
    
    def sort_by_matches(ref, lists):
        reference = set(ref)
        lists = sorted([[len(reference.intersection(set(x))), x] for x in lists], key=lambda x: (x[0], -len(x[1])), reverse=True)
    
        for count, a_list in lists:
            print("Matches {} in {}".format(count, a_list))
    
    sort_by_matches(pyp1, [idx1, myc2, mik1, zach1])
    

    这会给你:

    Matches 8 in ['yaz', 'avur', 'mir', 'riem', 'kiss', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'ariem', 'miss', 'pass', 'naz']
    Matches 8 in ['yaz', 'avur', 'mir', 'riem', 'kiss', 'pass', 'sash', 'zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup']
    Matches 5 in ['ayaz', 'aavur', 'amir', 'ariem', 'miss', 'pass', 'zash', 'zopp', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup', 'avenir']
    Matches 4 in ['zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'many', 'may1', 'myc2']
    

    要确定名称,您需要将其与每个列表一起传递,如下所示:

    pyp1 = ['yaz', 'vur', 'mir', 'rim', 'kiss', 'pass', 'qash', 'topp', 'goz', 'trs1', 'tsne', 'tkn', 'kaz']
    idx1 = ['yaz', 'avur', 'mir', 'riem', 'kiss', 'pass', 'sash', 'zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup']
    myc2 = ['ayaz', 'aavur', 'amir', 'ariem', 'miss', 'pass', 'zash', 'zopp', 'gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'lor', 'lah', 'many', 'cup', 'avenir']
    mik1 = ['yaz', 'avur', 'mir', 'riem', 'kiss','gopa', 'trs1', 'tsne', 'tkn', 'kaz', 'ariem', 'miss', 'pass', 'naz']
    zach1 = ['zopp', 'gop', 'trs1', 'tsne', 'tkn', 'kaz', 'many', 'may1', 'myc2']  
    
    def sort_by_matches(ref, lists):
        reference = set(ref)
        lists = sorted([[len(reference.intersection(set(l))), name, l] for name, l in lists], key=lambda x: (x[0], -len(x[2])), reverse=True)
    
        for matches, name, a_list in lists:
            print("Matches {} in {}".format(matches, name))
    
    sort_by_matches(pyp1, [("idx1", idx1), ("myc2", myc2) , ("mik1", mik1), ("zach1", zach1)])
    

    给你:

    Matches 8 in mik1
    Matches 8 in idx1
    Matches 5 in myc2
    Matches 4 in zach1
    

    【讨论】:

    • 谢谢@Martin 当我运行函数的第二部分按匹配数排名时,我得到NameError: name 'lists' is not defined
    • 我试过lists = sorted([[len(reference.intersection(set(x))), x] for x in lists], key=lambda x: (x[0], -len(x[1])), reverse=True) 我得到TypeError: 'NoneType' object is not iterable
    • 还有,如何修改函数,所以我得到Matches 8 in idx1Matches 5 in myc2Matches 8 in mik1Matches 4 in zach1
    • 显示列表之间的所有常见字符串,我打算使用common = set(pyp1).intersection(myc2)
    • 您需要将每个列表的名称与列表一起传递,实际上不可能获得用于构造列表的变量名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2019-04-15
    • 2019-12-19
    • 1970-01-01
    • 2021-06-17
    • 2015-01-08
    相关资源
    最近更新 更多