列表理解或实现调色板rgb到hex的较短形式



如何将for循环转换为列表理解?

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']

有没有一种蟒蛇般的方法可以减少这一部分的重复?:-

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

最简单的方法是使用字符串格式,无论是否在列表中:

[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}')

您可以简单地使用列表理解和f-string:

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

在格式化上,初始0表示用0-s填充空格,2表示填充到两个字符,x表示使用十六进制。

或者,如果你使用的是像3.5这样的旧Python,你可以使用字符串格式而不是f-string:

hex_palette = ["#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}".format(rgb=rgb) for rgb in rgb_arr]

还有一个变体:

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

(注意值<10(。

也可以使用内置的matplotlib函数。。。

from matplotlib.colors import to_hex

您可以先将RGB int标准化,也可以将其转换为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']

如果目标是尽量减少代码重复,您还可以将颜色值映射到格式化字符串的format方法:

[f"#{''.join(map('{:02x}'.format, c))}" for c in rgb_arr]

使用webcolors的懒惰方式:

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

最新更新