Tout d'abord, vous devriez utiliser les distances de Levenshtein entre les chaînes de caractères, j'ai trouvé un lien avec le suivant Algorithme de distance de Levenshtein pour Python :
# Define Levenshtein distance function (from the mentioned link)
def levenshtein(s1, s2):
if len(s1) < len(s2):
return levenshtein(s2, s1)
if len(s2) == 0:
return len(s1)
previous_row = range(len(s2) + 1)
for i, c1 in enumerate(s1):
current_row = [i + 1]
for j, c2 in enumerate(s2):
insertions = previous_row[j + 1] + 1
deletions = current_row[j] + 1
substitutions = previous_row[j] + (c1 != c2)
current_row.append(min(insertions, deletions, substitutions))
previous_row = current_row
return previous_row[-1]
Une fois que vous avez compris cela, vous devriez créer une fonction capable de trouver la correspondance la plus proche entre une chaîne de caractères donnée et la liste des noms bien orthographiés.
names_list = ['bercelona', 'emstrdam', 'Praga']
good_names = ['New York', 'Amsterdam', 'Barcelona', 'Berlin', 'Prague']
# Define a function that returns the best match
def get_closest_match(name, real_names):
levdist = [levenshtein(name, real_name) for real_name in real_names]
for i in range(len(levdist)):
if levdist[i] == min(levdist):
return real_names[i]
# Loops the first list
final_list = [ get_closest_match(name, good_names) for name in names_list ]
Enfin, il suffit de boucler la première liste avec cette fonction. Le résultat est le suivant :
>>> print final_list
['Barcelona', 'Amsterdam', 'Prague']