Сравнение двух слов из двух списков в Python
Я хотел бы сравнить слова, которые находятся в двух разных списках, поэтому, например, у меня есть:
['freeze', 'dog', 'затруднительный','answer'] и другой список ['freaze','dot','dificult','anser']. Я хочу сравнить слова в этом списке и поставить оценки за неправильные буквы. Итак, +1 за правильность, и -1 за неправильную букву. Чтобы дать некоторый контекст, в тесте правописания первый список будет ответами, а второй список будет ответами студента. Как я буду делать это?
1 ответ
Предполагая, что два списка имеют одинаковую длину, и у вас есть некоторая функция grade(a,b)
где a,b
это строки:
key = ['freeze','dog','difficult','answer']
ans = ['freaze','dot','dificult','anser']
pairs = zip(key, ans)
score = sum(grade(k,v) for (k,v) in pairs)
Возможная функция оценки будет:
def grade(a,b):
return 1 if a == b else -1
Функция оценки, которая наказывает каждого неправильного символа и дает 1pt для правильного написания (это звучит жестко...) может быть:
def grade(a,b):
score = sum(a == b for (a,b) in zip(a,b)) - max(len(a), len(b))
return score if score else 1
Если вы хотите расстояние Левенштейна, вы, вероятно, захотите grade
функция, чтобы быть оберткой вокруг следующего, который был найден в Wikibooks и кажется достаточно эффективным:
def levenshtein(seq1, seq2):
oneago = None
thisrow = range(1, len(seq2) + 1) + [0]
for x in xrange(len(seq1)):
twoago, oneago, thisrow = oneago, thisrow, [0] * len(seq2) + [x + 1]
for y in xrange(len(seq2)):
delcost = oneago[y] + 1
addcost = thisrow[y - 1] + 1
subcost = oneago[y - 1] + (seq1[x] != seq2[y])
thisrow[y] = min(delcost, addcost, subcost)
return thisrow[len(seq2) - 1]
Вы также можете взглянуть на difflib
делать более сложные вещи.