Python 基于另一个元组中的匹配项对元组列表进行排序

Python 基于另一个元组中的匹配项对元组列表进行排序,python,list,sorting,tuples,Python,List,Sorting,Tuples,我试图通过匹配对两个元组列表进行排序。这些元组包含从体育博彩网站上截取的数据。我已经编写了一些代码来匹配每个列表中的条目,并将它们附加到一个新列表中。我遇到的问题是找到一个排序函数,它可以根据不完美的匹配进行搜索,例如,名字中可能有额外的空格,或者在sportsbet_列表中可能有缩短的团队名称,例如“N昆士兰牛仔”,而不是列表_结尾中的北昆士兰牛仔。见以下列表: list_finale = [[('Canterbury Bulldogs ', '3.25'), ('South Sydney R

我试图通过匹配对两个元组列表进行排序。这些元组包含从体育博彩网站上截取的数据。我已经编写了一些代码来匹配每个列表中的条目,并将它们附加到一个新列表中。我遇到的问题是找到一个排序函数,它可以根据不完美的匹配进行搜索,例如,名字中可能有额外的空格,或者在sportsbet_列表中可能有缩短的团队名称,例如“N昆士兰牛仔”,而不是列表_结尾中的北昆士兰牛仔。见以下列表:

list_finale = [[('Canterbury Bulldogs ', '3.25'), ('South Sydney Rabbitohs', '1.34')], [('Parramatta Eels ', '1.79'), ('Wests Tigers', '2.02')], [('Melbourne Storm ', '1.90'), ('Sydney Roosters', '1.90')], [('Gold Coast Titans ', '1.86'), ('Newcastle Knights', '1.94')], [('New Zealand Warriors ', '1.39'), ('North Queensland Cowboys', '2.95')], [('Cronulla Sharks ', '1.68'), ('Penrith Panthers', '2.18')], [('St. George Illawarra Dragons ', '1.45'), ('Manly Sea Eagles', '2.74')], [('Canberra Raiders ', '1.63'), ('Brisbane Broncos', '2.26')]]


sportsbet_list = [[('Cronulla Sharks', '1.64'), ('Penrith Panthers', '2.27')], [('Canterbury Bulldogs', '3.30'), ('South Sydney Rabbitohs', '1.33')], [('Melbourne Storm', '1.90'), ('Sydney Roosters', '1.90')], [('New Zealand Warriors', '1.40'), ('Nth Queensland Cowboys', '2.90')], [('St George Illawarra Dragons', '1.45'), ('Manly Sea Eagles', '2.75')], [('Gold Coast Titans', '1.85'), ('Newcastle Knights', '1.95')], [('Canberra Raiders', '1.60'), ('Brisbane Broncos', '2.30')], [('Parramatta Eels', '1.90'), ('Wests Tigers', '1.90')], [('Sydney Roosters', '1.35'), ('St George Illawarra Dragons', '3.20')], [('Melbourne Storm', '1.25'), ('New Zealand Warriors', '4.00')], [('Canterbury Bulldogs', '1.56'), ('Nth Queensland Cowboys', '2.40')], [('Penrith Panthers', '2.20'), ('South Sydney Rabbitohs', '1.67')], [('Wests Tigers', '1.67'), ('Gold Coast Titans', '2.20')], [('Brisbane Broncos', '1.70'), ('Cronulla Sharks', '2.15')], [('Manly Sea Eagles', '1.85'), ('Canberra Raiders', '1.95')], [('Newcastle Knights', '1.80'), ('Parramatta Eels', '2.00')]]
我用于对这些列表进行排序的当前代码如下所示:

list_n = []

list_n1 = []

for a in sportsbet_list:
    for b in list_finale:
        if b[0][0] == a[0][0] and b[1][0] == a[1][0]:
            list_n.append(a)
            list_n1.append(b)

这是有效的,但只有当团队名称完全相同时才有效

基本上我需要一个匹配函数来接受
b[0][0]==a[0][0]和b[1][0]==a[1][0]
:如果它们85%相似或类似的话


我对编码非常陌生,因此如果您有任何建议或帮助,我将不胜感激。

您可以选择几条路线。第一种可能是更严格的匹配解决方案,而第二种是模糊的

  • 更严格的方法(规范化输入,然后进行正常排序)
这个解决方案可能适合您的需要,也可能不适合您的需要,但基本上是这样的:您需要使这些名称尽可能接近所需的状态。下面是一个示例,希望能说明您可能会做什么:

team_bet_list=[('Canterbury Bulldogs','3.25'),('South Sydney Rabbitohs','1.34')]
def正常化团队(项目):
替换={
“北”:“北”,
“南方”:某物,等等
}
words=[word.lower(),用于项[0]中的word。strip()]
return(words,item[1])#返回一个新的元组——如果这对您很重要,您甚至可能希望返回原始的非规范化值
标准化的\u值=[团队\u赌注\u列表中对的标准化(对)]
#现在您应该能够对这些进行排序,但要找到最佳的规范化方法还需要一些实验
  • 第二种选择是使用模糊匹配。我想到了两个。首先是使用levenstien距离,它基本上根据需要发生的字符更改的数量告诉您任意两个字符串的距离。(例如,rope->boat的距离为3({r->b,p->a,e->t})。使用此选项,您可以尝试在每个列表中找到最接近的匹配项,并假设它是正确的值。或者,您可以尝试使用类似fuzzywuzzy的库。这对我来说非常有效。请参阅

你是如何定义相似性的?你可以使用
strip
删除空格,对于短名称,我认为你必须进行查找
dict