在给定Rgb范围的情况下创建十六进制代码列表

时间:2014-11-17 10:53:50

标签: python string list hex concatenation

我将RGB的这3个顶点(结束值)设为#ff0000#ffcfcf#350000,其中R35变为ff G00cfB00cfimport re my_list=[] for i in xrange(53,256): for j in xrange(0,208): for k in xrange(0,208): item = str(hex(i))+str(hex(j))+str(hex(k)) item2 = re.sub('(0x)','',item) my_list.append(item2) 。我需要创建一个列表,列出它们之间的所有可能值。我做了以下事情:

RGB

我迭代整数值并将它们转换为十六进制,然后连接0x值并从连接字符串中取代{{1}}(这不起作用)。这种方法很慢。有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

作为基准测试,我在计算机上运行了代码。它需要27.8秒。

正则表达式总是很昂贵,所以让我们通过简单的字符串替换替换它们:

my_list=[]
for i in xrange(53,256):
    for j in xrange(0,208):
        for k in xrange(0,208):
            item = str(hex(i))+str(hex(j))+str(hex(k))
            item2 = item.replace("0x", "")
            my_list.append(item2)

这需要8.8秒。

但所有这些采用十六进制数字的字符串表示并删除它前面的0x 对我来说似乎有点 off ,特别是因为Python已经构建-in用于此目的的字符串格式:

my_list=[]
for i in xrange(53,256):
    for j in xrange(0,208):
        for k in xrange(0,208):
            my_list.append("{0:02x}{1:02x}{2:02x}".format(i,j,k))

这需要8.3秒。稍微好一点,但它看起来也更清洁。如果我们使用itertools,我们甚至可以将其写为单行(没有长行换行符和导入语句):

import itertools
my_list = ["{0:02x}{1:02x}{2:02x}".format(i,j,k) for i,j,k
           in itertools.product(xrange(53,256), xrange(0,208), xrange(0,208))]

这需要8.1秒。还没有。

现在,字符串格式化是花费大部分时间的操作。这也是我们可以轻松避免的操作(因为我们只是格式化相同的256个值)。让我们创建一个查找表:

import itertools
m = ["{0:02x}".format(i) for i in xrange(256)]
my_list = [m[i] + m[j] + m[k] for i,j,k
        in itertools.product(xrange(53,256), xrange(0,208), xrange(0,208))]

运行时间:1.6秒。希望足够快。