Преобразование шестнадцатеричной строки в шестнадцатеричное число в python без потери точности

Итак, я использую ответ на этот вопрос, чтобы раскрасить некоторые значения, которые у меня есть для некоторых полигонов, чтобы нанести их на экземпляр базовой карты. Я изменил функцию, найденную в этой ссылке, следующим образом. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно преобразовать строку, которую она возвращает, в шестнадцатеричную цифру, чтобы использовать ее, чтобы я мог раскрасить многоугольники. Но когда я конвертирую что-то вроде «0x00ffaa» в шестнадцатеричное число python, оно меняет его на «0xffaa», которое нельзя использовать для окрашивания многоугольника.

Как я могу обойти это?

Вот измененная функция:

def rgb(mini,maxi,value):
    mini, maxi, value = float(mini), float(maxi), float(value)
    ratio = 2* (value - mini) / (maxi-mini)
    b = int(max(0,255*(1-ratio)))
    r = int(max(0,255*(ratio -1)))
    g = 255 - b - r
    b = hex(b)
    r = hex(r)
    g = hex(g)
    if len(b) == 3:
        b = b[0:2] + '0' + b[-1]
    if len(r) == 3:
        r = r[0:2] + '0' + r[-1]
    if len(g) == 3:
        g = g[0:2] + '0' + g[-1]
    string = r+g[2:]+b[2:]
    return string

person K. Shores    schedule 12.10.2015    source источник
comment
Итак, просто чтобы прояснить это для других людей, таких как я, которые имеют ошибочное понимание, значения rgb должны передаваться в форме «# 00ffaa», обратите внимание на символ фунта. См. matplotlib.org/api/colors_api.html .   -  person K. Shores    schedule 12.10.2015


Ответы (2)


Ответ от cdarke в порядке, но использование оператора % для интерполяции строк не рекомендуется. Для завершения, вот функция format или метод str.format:

>>> format(254, '06X')
'0000FE'

>>> "#{:06X}".format(255)
'#0000FF'

Ожидается, что новый код будет использовать один из вышеперечисленных вместо оператора %. Если вам интересно, «почему у Python есть функция форматирования, а также метод форматирования?», см. мой ответ на этот вопрос.

Но обычно вам не нужно беспокоиться о представлении значения, если используемая вами функция/метод принимает как целые числа, так и строки, потому что в этом случае строка '0x0000AA' совпадает с целым числом значение 0xAA или 170.

person Paulo Scardine    schedule 12.10.2015
comment
Это помогает, но я не уверен, что понимаю, как его использовать. Сейчас я использую color_string.format(255), который даст мне что-то вроде 0x00ffaa (для любого ввода, который должен быть). Но мне нужно передать цвет в виде шестнадцатеричной цифры, поэтому я использую hex(int(color_string,16)), который затем возвращает число обратно в 0xffaa, которое нельзя использовать в качестве значения цвета rgb. Это помогает объяснить мое замешательство? - person K. Shores; 12.10.2015
comment
За исключением того, что реальный ожидаемый формат — «#000000», не так ли? Ура, огрехи в понимании! - person K. Shores; 12.10.2015

Используйте форматирование строки, например:

>>> "0x%08x" % 0xffaa
'0x0000ffaa'
person cdarke    schedule 12.10.2015