我有一堆列表,每个都有很多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)
进行排名。< / p>
我怎样才能使用新功能?感谢帮助。
答案 0 :(得分: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
。 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