Brute Force

class Solution:
    def similarRGB(self, color: str) -> str:
        res = ['#']
        n = len(color)
        for i in range(1,n,2):
            cc = color[i:i+2]
            if cc[0] == cc[1]:
                res.append(cc)
            elif cc[0] > cc[1]:
                higher = cc[0]*2
                lower = hex(int(cc[0],16)- int('1',16))[2]*2
                higher_diff = int(higher,16)-int(cc,16)
                lower_diff = int(cc,16) - int(lower,16)
                close = lower if lower_diff <= higher_diff else higher 
                res.append(close)
            else:
                higher = hex(int(cc[0],16)+int('1',16))
                higher = higher[2]*2
                lower = cc[0]*2
                higher_diff = int(higher,16)-int(cc,16)
                lower_diff = int(cc,16) - int(lower,16)
                close = lower if lower_diff <= higher_diff else higher 
                res.append(close)
        return ''.join(res)

or use lambda function to find the best candicate closest to each character pair

class Solution:
    def similarRGB(self, color: str) -> str:
        n = len(color)
        def find(s):
            return min(['00', '11', '22', '33', '44', '55', '66', '77', '88', '99', 'aa', 'bb', 'cc', 'dd', 'ee', 'ff'],
                key = lambda x : abs(int(s,16)-int(x,16)) 
               )
            
        res = [find(color[i:i+2]) for i in range(1,n,2)]
        return '#'+''.join(res)

Knowledge point: to add/ substract two hex number, use hex(int(‘a’,16)-+ int(‘e’,16)), hex(‘a’) == 0xa