Передать строку в формат RGB Color

У меня есть такой дикт:

colour_dict = {'Red': '0xFF, 0x00, 0x00','Green':'0x00, 0xFF, 0x00','White':'0xFF, 0xFF, 0xFF','Yellow':'0xff, 0xff, 0x00'}

Мне нужно передать значение этого словаря в этот код, и он работает правильно:

from pptx.dml.color import RGBColor
RGBColor(0xFF, 0x00, 0x00) 

Когда я делаю ниже, чтобы добиться того же:

RGBColor(colour_dict["Red"])

Это выдает мне ошибку, так как это строка, и это просто нужно в прямом числовом формате.

Я уже пытался преобразовать эту строку в формат int, но ничего не работает.

Общая проблема:

Как передать значение в RGBColor с помощью dict?

Это не проблема со словарем. colour_dict["Red"] — это нить'0xFF, 0x00, 0x00', а не 3 отдельных числовых значения. Сопоставьте свой словарь и проанализируйте значения в кортежах/трехэлементных списках числовых значений.

h4z3 27.05.2019 14:18

@ h4z3: я не говорю, что это проблема с dict, все, что я пытаюсь сказать, это как решить эту проблему, учитывая, что она дает строку

Rahul Agarwal 27.05.2019 14:20

Что касается конвертации, не забудьте передать, какую базу использовать: int('0xFF', base=16)

h4z3 27.05.2019 14:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
943
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

colour_dict["Red"] — это нить"0xFF, 0x00, 0x00", который, конечно, нельзя напрямую преобразовать в int.

Вам нужно преобразовать каждую часть строки и передать эти значения конструктору RGBColor:

color = RGBColor(*map(lambda v : int(v, 16), colour_dict["Red"].split(',')))

ПРИМЕЧАНИЕ: В этой строке много чего происходит, поэтому я разобью ее и объясню:

  • colour_dict["Red"].split(',') извлекает подстроки значений цвета: ['0xFF', '0x00', '0x00']

  • map() применяет функцию, переданную в качестве первого аргумента, к каждому значению в итерации, переданной в качестве второго аргумента.

  • lambda v : int(v, 16) преобразует v из шестнадцатеричной строки в целое число

  • * перед map mans "распаковать значения в следующей итерации". это удобный способ передать список значений RGB вместо вызова RGBColor(R_val, G_val, B_val).


Версия Python 2:

Поскольку python 2 не поддерживает оператор звездочки, вам нужно разделить оператор на две части:

r,g,b = map(lambda v : int(v, 16), colour_dict["Red"].split(','))
color = RGBColor(r,g,b)

Или просто измените dict на colour_dict = {'Red': [0xFF, 0x00, 0x00],...}, а затем позвоните RGBColor(*colour_dict["Red"])

orangeInk 27.05.2019 14:23

Да, конечно, изменение ввода решит проблему, но ОП специально запрашивает способ передачи цвета в виде строкового формата.

GPhilo 27.05.2019 14:23

Я не критиковал ваш ответ, я просто хотел указать, что изменение ввода сделает код более читаемым.

orangeInk 27.05.2019 14:27

@orangeInk Я согласен, но возможно, что dict просто указан в этом формате (например, значения загружаются из файла), поэтому я обычно предполагаю, что изменение формата ввода не является возможным решением :)

GPhilo 27.05.2019 14:30

@GPhilo: Можете ли вы также дать соответствующий ответ Python 2.7 на это ... поскольку оператор * показывает ошибку !!

Rahul Agarwal 12.06.2019 11:25

Вместо Python 2.7 написано Invalid Syntax

Rahul Agarwal 12.06.2019 11:27

Заменять

RGBColor(colour_dict["Red"])

к

eval("RGBColor({})".format(colour_dict["Red"]))

Всегда следует избегать использования eval, если есть жизнеспособная альтернатива

GPhilo 27.05.2019 14:23

Я нахожу map lambda answer немного излишним, вот менее причудливый вариант:

color = RGBColor(*[int(x,16) for x in colour_dict["Red"].split(",")])

color_dict["Red"] - это строка, а не три числа

вы можете сделать так:

a = list(colour_dict["Red"])
RGBColor(int(a[0]), int(a[2]), int(a[4]))

a:['0xFF', ',', '0x00', ',', '0x00'], всего 5 символов

Другие вопросы по теме