Понимание списка или более короткая форма, которая достигает от rgb до hex для цветовой палитры - PullRequest
1 голос
/ 20 марта 2020

Как я могу преобразовать это для l oop в понимание списка?

rgb_arr = [[217, 180, 131], [242, 228, 221], [132, 174, 221], [203, 135, 74], [28, 49, 21],
[154, 179, 101], [213, 200, 186], [87, 143, 51]]

hex_palette = []
for rgb in rgb_arr:
    col_hex = '#' + hex(rgb[0]).split('x')[-1] + hex(rgb[1]).split('x')[-1] + hex(rgb[2]).split('x')[-1]
    hex_palette.append(col_hex)
print(hex_palette)

Результирующий шестнадцатеричный список из оператора печати должен выглядеть следующим образом

['#d9b483', '#f2e4dd', '#84aedd', '#cb874a', '#1c3115', '#9ab365', '#d5c8ba', '#578f33']

Есть ли Pythoni c способ уменьшения повторения этой части?: -

hex(rgb[0]).split('x')[-1] +

Ответы [ 6 ]

2 голосов
/ 20 марта 2020

Самый простой способ сделать это - использовать форматирование строки в представлении списка или нет:

[f'#{a:02x}{b:02x}{c:02x}' for a,b,c in rgb_arr]

Или просто:

result = []
for a,b,c in rgb_arr:
    result.append(f'#{a:02x}{b:02x}{c:02x}')
1 голос
/ 20 марта 2020

Если цель состоит в том, чтобы минимизировать повторение кода, вы также можете сопоставить значения цвета с методом format строки форматирования:

[f"#{''.join(map('{:02x}'.format, c))}" for c in rgb_arr]
1 голос
/ 20 марта 2020

также может использовать встроенные функции matplotlib ...

from matplotlib.colors import to_hex

вы можете либо нормализовать RGB-числа перед рукой, либо просто преобразовать их в массив numpy и сделать это:

rgb_arr = np.array(rgb_arr)
hex_palette = [to_hex(rgb/255) for rgb in rgb_arr]

вывод:

['#d9b483', '#f2e4dd', '#84aedd', '#cb874a', '#1c3115', '#9ab365', '#d5c8ba', '#578f33']
1 голос
/ 20 марта 2020

Еще один вариант:

[("#%02x%02x%02x"%tuple(b)) for b in rgb_arr]

(чтобы позаботиться о значениях <10). </p>

1 голос
/ 20 марта 2020

Вы можете просто использовать списки и f-строки:

hex_palette = [f"#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}" for rgb in rgb_arr]

При форматировании начальное значение 0 означает заполнение пустых мест с помощью 0 -s, 2 означает заполнять до двух символов, а x означает использование шестнадцатеричного числа.

Или, если вы используете более старую Python, например, 3,5, вы можете использовать форматирование строки вместо f-строк:

hex_palette = ["#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}".format(rgb=rgb) for rgb in rgb_arr]
0 голосов
/ 20 марта 2020

Ленивый способ с использованием веб-цветов :

from webcolors import rgb_to_hex
rgb_arr = [[217, 180, 131], [242, 228, 221], [132, 174, 221], [203, 135, 74], [28, 49, 21], [154, 179, 101], [213, 200, 186], [87, 143, 51]]
[rgb_to_hex(x) for x in rgb_arr]

pip install webcolors
...