немного другая функция эквивалентности строк в Python - PullRequest
2 голосов
/ 03 августа 2011

У меня есть несколько строк, которые не будут точно совпадать, но должны рассматриваться как эквивалентные. Например, «Боб» и «Роберт» или «WWF» и «Всемирная федерация борьбы».

Чтобы реализовать функцию эквивалентности, я собирался поместить все эквивалентные строки в кортежи, а затем все кортежи в список. Затем для каждой пары входных строк проверьте, существуют ли они в одном и том же кортеже, и, если так, верните true. Кто-нибудь может предложить более элегантный способ сделать это?

Спасибо, Ричард

РЕДАКТИРОВАТЬ: Чтобы уточнить, функция может принимать любые два из («Боб», «Робби», «Роберт», «Роберто») и должна возвращать true.

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Если ваш список кортежей эквивалентности равен EQUIVALENCES, вы можете создать словарь, отображающий каждую строку в ее эквивалентности:

word_equivs = {}

for equiv in EQUIVALENCES:
    for word in equiv:
        word_equivs[word] = equiv

Затем вы можете проверить, эквивалентны ли две строки, посмотрев, соответствуют ли они одной и той же эквивалентности:

def equivalent(s1, s2):
    e1 = word_equivs.get(s1) 
    e2 = word_equivs.get(s2)
    if e1 and e2:
        return e1 == e2
    else:
        return s1 == s2
0 голосов
/ 03 августа 2011

Я бы предложил использовать словарь от строки до int. Затем для каждого набора эквивалентных строк увеличивается счетчик переменной counter может использовать

counter  = 0
d = defaultdict(int)
d["WWF"] = d["World Wrestling Federation"] = counter++;
d["Bob"]=d["Marley"]=counter++

А когда вы хотите выяснить эквивалентность, просто сделайте

if( d[s1]==d[s2] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...