Сравните два целых числа на предмет сходства

#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))
  

возвращает разницу в сумме всех позиций.