Сравнение двух слов из двух списков в 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 делать более сложные вещи.

Другие вопросы по тегам