根据列表与参考列表的内容相似性对列表进行排序

2024-10-01 02:39:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一堆列表,每个列表都有许多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)与引用列表比较的相同字符串的数量对它们进行排序。你知道吗

如何使用新功能?谢谢你的帮助。你知道吗


Tags: 列表排序passkissmanymirtsneyaz
1条回答
网友
1楼 · 发布于 2024-10-01 02:39:59

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

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。e、 g

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

相关问题 更多 >