我有一份以十六进制表示颜色的列表 - 我需要将它们排序以匹配彩虹中颜色的顺序。 - 我可以硬编码一个排序顺序 - 但我觉得有更简洁的方法。
这是一个函数,它可以接受一个以十六进制RGB格式表示的颜色值,并返回其HSV颜色值:
import colorsys
def get_hsv(hexrgb):
hexrgb = hexrgb.lstrip("#") # in case you have Web color specs
r, g, b = (int(hexrgb[i:i+2], 16) / 255.0 for i in xrange(0,5,2))
return colorsys.rgb_to_hsv(r, g, b)
现在,您可以使用这个方法通过色调对 RGB 十六进制颜色列表进行排序:color_list = ["000050", "005000", "500000"] # GBR
color_list.sort(key=get_hsv)
print color_list
通过使用完整的HSV元组进行排序,可以确保没有色调(即灰度)的颜色以一致的位置排序,并且具有相同色调但不同饱和度/值的颜色与它们更饱和/值的对应物相对排序。
如果颜色的饱和度(强度)或值(亮度)差异很大,则仍会出现一些混乱,但是无法避免。
查找HSV颜色表示:https://zh.wikipedia.org/wiki/HSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4
通过首先按色相排序,您可以按感知颜色进行排序。您可以自由地在RGB和HSV之间转换。
修改kindall的答案,允许使用短的十六进制颜色规范(例如#f0f
,#005
):
import colorsys
def get_hsv(hexrgb):
hexrgb = hexrgb.lstrip("#") # in case you have Web color specs
lh = len(hexrgb)
# Allow short and long hex codes
r, g, b = (int(hexrgb[i:i+lh/3], 16) / 255.0 for i in xrange(0, lh, lh/3))
return colorsys.rgb_to_hsv(r, g, b)
color_list = ["#005", "#000500", "#500000"]
color_list.sort(key=get_hsv)
print color_list
>> ['#500000', '#000500', '#005']