как новый подход к решению моего вызова описал here, я соединил следующее:Уплотненные для цикла поэлементного сравнения списка
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
diffs =[
"""- It contains a Title II provision that changes the age at which workers
compensation/public disability offset ends for disability beneficiaries from age 65 to full retirement age (FRA).""",
"""+ It contains a Title II provision that changes the age at which workers
compensation/public disability offset ends for disability beneficiaries from age 68 to full retirement age (FRA).""",
"""+ Here's a new paragraph I added for testing."""]
for s in diffs:
others = [i for i in diffs if i != s]
for j in others:
if similar(s, j) > 0.7:
print '"{}" and "{}" refer to the same sentence'.format(s, j)
print
diffs.remove(j)
else:
print '"{}" is a new sentence'.format(s)
Идея заключается в петлю над струнами, и сравнить друг с другие. Если заданная строка считается похожей на другую, удалите другую, в противном случае данная строка будет считаться уникальной строкой в списке.
Вот результат:
"- It contains a Title II provision that changes the age at which workers
compensation/public disability offset ends for disability beneficiaries from age 65 to full retirement age (FRA)." and "+ It contains a Title II provision that changes the age at which workers
compensation/public disability offset ends for disability beneficiaries from age 68 to full retirement age (FRA)." refer to the same sentence
"- It contains a Title II provision that changes the age at which workers
compensation/public disability offset ends for disability beneficiaries from age 65 to full retirement age (FRA)." is a new sentence
"+ Here's a new paragraph I added for testing." is a new sentence
Так что это правильно обнаружение того, что первые два предложения похожи, и что последний является уникальным. Проблема в том, что это то, что нужно вернуться и считать первое предложение уникальным (чего нет, и оно не должно возвращаться к этому предложению).
Где ошибка в моей логике цикла? Может ли это быть достигнуто без вложенных for
s и удаления элементов?
** НЕ ** изменить список в то время как итерация над ним – spicavigo
@spicavigo Правильно. Это очень очевидно. Следовательно, вопрос. – Pyderman
Вы не можете del ete из 'diffs', пока вы все еще повторяете его; он испортит итерацию. Вместо этого скопируйте список различий для удаления и удаления в конце. Кроме того, вы, скорее всего, ускорите свой код, используя 'itertools.combinations' вместо цикла вложенных циклов. – BrenBarn