Сортировка списка кортежей на основе совпадений в другом

#python #list #sorting #tuples

#python #Список #сортировка #кортежи

Вопрос:

Я пытаюсь отсортировать два списка кортежей по совпадениям друг с другом. Кортежи содержат данные, взятые с сайтов ставок на спорт. Я написал некоторый код, который сопоставляет записи в каждом списке и добавляет их в новый список. Проблема, с которой я сталкиваюсь, заключается в поиске функции сортировки, которая может выполнять поиск на основе несовершенных совпадений, например, в имени может быть лишний пробел или могут быть сокращенные названия команд, такие как ‘Nth Queensland Cowboys’ в sportsbet_list в отличие от North Queensland Cowboys в list_finale. Смотрите списки ниже:

 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] and b[1][0] == a[1][0] : если они на 85% похожи или что-то в этом роде.

Я очень новичок в программировании, поэтому буду признателен за любые предложения или помощь.

Комментарии:

1. Как вы определяете сходство?

2. вы можете использовать strip для удаления пробелов, а для коротких имен, я думаю, вам придется выполнить поиск dict

Ответ №1:

Есть несколько маршрутов, которые вы можете выбрать. Первое, вероятно, является более строгим решением для сопоставления, в то время как второе немного нечеткое.

  • Более строгий метод (нормализуйте входные данные, затем выполните обычную сортировку)

Это решение может работать или не работать для ваших нужд, но в основном это так: вам нужно получить эти имена как можно ближе к желаемому состоянию. Вот пример, который, надеюсь, иллюстрирует, что вы могли бы сделать:

 team_bet_list = [('Canterbury Bulldogs ', '3.25'), ('South Sydney Rabbitohs', '1.34')] 

def normalize_team(item):
    substitutions = {
      'north': 'nth',
      'south': 'sth',  # etc
    }
    words = [word.lower() for word in item[0].strip()]
    return (words, item[1])  # returning a new tuple -- you might even want to return the original non-normalized value, if that's important to you

normalized_values = [normalize(pair) for pair in team_bet_list]

# Now you should be able to sort these, but it'll take some experimentation to find the best normalization approach
 
  • Второй вариант — использовать нечеткий вид совпадения. На ум приходят два. Во-первых, нужно использовать расстояние Левенштейна, которое в основном сообщает вам, как далеко находятся любые две строки, в зависимости от количества изменений символов, которые должны произойти. (например, rope -> boat имеет расстояние 3 ( { r-> b, p -> a, e-> t}. Используя это, вы можете попытаться найти ближайшее совпадение в каждом списке и предположить, что это правильное значение. Или вы можете попробовать библиотеку, такую как fuzzywuzzy . Раньше это работало прилично для меня. См. https://github.com/seatgeek/fuzzywuzzy