Сравнение чисел в диапазоне
Функция возвращает цвет пикселя в RGB формата [255, 255, 255]. На некоторых устройствах цвет почемуто разнится в диапазоне +1 -1. Пример:
ПервоеУстройство = getRGBcolor(20, 34) # Вернуло [107, 182, 148]
ВтороеУстройство = getRGBcolor(20, 34) # Вернуло [107, 182, 149]
if getRGBcolor(20,34) == [107, 182, 148]:
Делаем действия..
Редактировать на каждом устройстве цвет под нужный идея бредовая. Поэтому решил написать функцию которая вернет нам True если цифры находятся в диапазоне.
def (colorInPos, checkColor): #getRGBcolor(20, 34), checkColor = [107, 182, 148]
val1 = colorInPos[0] - checkColor[0]
val2 = colorInPos[1] - checkColor[1]
val3 = colorInPos[2] - checkColor[2]
if val1 <= 3 and val2 <= 3 and val3 <=3:
return True
И я решил что могу эту задачу решить отнимая числа друг от друга. Но выглядит это так себе.. Может есть метод покрасивее/получше?
Ответы (2 шт):
Для начала, можно сделать цикл вместо прямого сравнения 0, 1, 2. Тогда она научится сравнивать любые 2 массива чисел, не так важно - это цвет или что.
def nearly_equal(list_1, list_2):
for a, b in zip(list_1, list_2):
if abs(a - b) >= 3: return False
return True
То же самое, с генератором + any(), который дает True только если все элементы переданного итерируемого объекта в логическом контексте будут True.
def nearly_equal(list_1, list_2, *, scatter = 2): # параметр - разброс.
return all(abs(a - b) <= scatter for (a, b) in zip(list_1, list_2))
print( nearly_equal([7, 7, 7], [5, 9, 5]) ) # True
print( nearly_equal([7, 7, 7], [5, 9, 5], scatter = 1) ) # False
print( nearly_equal([7, 7, 7], [8, 8, 8], scatter = 1) ) # True
ну например можно сделать так. сумма разниц для всех блоков не должна превысить лимит.
color1 = [107, 182, 148]
color2 = [106, 183, 149]
def is_eq(a, b):
return sum((abs(a-b) for a, b in zip(a, b))) < 4
print(is_eq(color1, color2))
в данном случае каждый блок разнится на +-1 что в сумме дадут 3. но тут есть подвох, один блок может отличаться на 3. тогда можно и по другому, например получить максимальную разницу max, которая должна быть не более 1
color1 = [107, 182, 148]
color2 = [106, 183, 149]
def is_eq(a, b):
return max((abs(a-b) for a, b in zip(a, b))) < 2
print(is_eq(color1, color2))