Сравните два целых числа на сходство - PullRequest
0 голосов
/ 03 ноября 2011

Пример:

number1 = 54378
number2 = 54379
if number1 (is similar to) number2:
   print (number1 + " " + number2)
   input("what to do")

Я хотел бы сравнить эти два числа и позволить программе уведомлять меня, когда происходит подобного рода (между числом 1 и номером 2).

Мне бы хотелось, чтобы решение было гибким, чтобы было больше сходства (только первая цифра отличается).

Кстати, я использую Python 3.X

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Вы можете использовать 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
0 голосов
/ 03 ноября 2011

Вы можете сделать одно из следующих действий:
Оба будут принимать неравные числа, такие как (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))

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

...