#python #comparison #similarity
#python #сравнение #сходство
Вопрос:
Пример:
number1 = 54378
number2 = 54379
if number1 (is similar to) number2:
print (number1 " " number2)
input("what to do")
Я хотел бы сравнить эти два числа, и пусть программа уведомит меня, когда произойдет такое сходство (между числами 1 и числами 2).
Я бы хотел, чтобы решение было гибким, с некоторым пространством для большего сходства (_ust первая цифра отличается).
Кстати, я использую Python 3.X
Комментарии:
1. Вы не определили сходство.
2. определите аналогично. Есть ли диапазон?
3. Похожие друг на друга, не похожи на 100%, но некоторые похожи. Я добавил больше объяснений.
Ответ №1:
Вы можете использовать difflib
для этого:
>>> from difflib import SequenceMatcher
>>> number1 = 54378
>>> number2 = 54379
>>> SequenceMatcher(None, str(number1), str(number2)).ratio()
0.80000000000000004
После создания SequenceMatcher
объекта со строковыми представлениями их чисел используйте ratio()
(или quick_ratio()
или real_quick_ratio()
, если скорость является проблемой), чтобы получить рейтинг сходства между 0 и 1.
Немного поиграв с этим, вы можете выяснить, какая хорошая метрика для того, насколько они должны быть похожи, и использовать ее следующим образом:
metric = 0.6 # just an example value
if SequenceMatcher(None, str(a), str(b)).ratio() > metric:
# a and b are similar
Комментарии:
1. это похоже на сравнение представления base10 двух чисел, а не самих чисел…
Ответ №2:
вы могли бы сделать одно из следующих действий:
оба будут принимать неравномерные числа, такие как (100, 10)
(200, 12)
from itertools import izip_longest
def findSim(a, b):
aS = str(a)
bS = str(b)
return [abs(int(x)-int(y)) if y != None else int(x) for x,y in izip_longest(aS,bS)]
возвращает список со всеми позиционными различиями,
from itertools import izip_longest
def findSim(a, b):
aS = str(a)
bS = str(b)
return sum(abs(int(x)-int(y)) if y != None else int(x) for x,y in izip_longest(aS,bS))
возвращает разницу в сумме всех позиций.