将字符串“aabbcc”>[“aa”,“bb”,“cc”]拆分为回复spli

2024-09-30 18:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在一个调用中根据标题拆分字符串。我正在寻找一个使用列表理解的简单语法,但我还没有:

s = "123456"

结果是:

^{pr2}$

我不想要的是:

re.split('(?i)([0-9a-f]{2})', s)
s[0:2], s[2:4], s[4:6]
[s[i*2:i*2+2] for i in len(s) / 2]

编辑

好的,我想解析一个十六进制的RGB[a]颜色(以及可能的其他颜色/组件格式),以提取所有组件。 似乎最快的方法是最后一个来自sven marnach的方法:

  1. sven-marnach X范围:每个回路0.883 usec

    python -m timeit -s 's="aabbcc";' '[int(s[i:i+2], 16) / 255. for i in xrange(0, len(s), 2)]'
    
  2. 线对/iter:1.38 usec/loop

    python -m timeit -s 's="aabbcc"' '["%c%c" % pair for pair in zip(* 2 * [iter(s)])]'
    
  3. 正则表达式:每个循环2.55 usec

    python -m timeit -s 'import re; s="aabbcc"; c=re.compile("(?i)([0-9a-f]{2})"); 
    split=re.split' '[int(x, 16) / 255. for x in split(c, s) if x != ""]'
    

Tags: 方法inreforlen颜色组件int
3条回答

通读这些注释,我们发现真正的问题是:解析十六进制RRGGBBAA格式的颜色定义字符串的最快方法是什么。以下是一些选项:

def rgba1(s, unpack=struct.unpack):
    return unpack("BBBB", s.decode("hex"))

def rgba2(s, int=int, xrange=xrange):
    return [int(s[i:i+2], 16) for i in xrange(0, 8, 2)]

def rgba3(s, int=int, xrange=xrange):
    x = int(s, 16)
    return [(x >> i) & 255 for i in xrange(0, 32, 8)]

正如我所料,第一个版本是最快的:

^{pr2}$
In [4]: ["".join(pair) for pair in zip(* 2 * [iter(s)])]
Out[4]: ['aa', 'bb', 'cc']

请参见:How does zip(*[iter(s)]*n) work in Python?以了解对相同str语法的奇怪“2-iter”的解释。在


你在评论中说你想“拥有最快的执行速度”,我不能向你保证这个实现,但是你可以使用^{}来测量的执行。当然记得what Donald Knuth said about premature optimisation。对于手头的问题(现在你已经揭示了它),我想你会发现{}很难克服。在

^{pr2}$

比较

python3.2 -m timeit -c '
s = "aabbcc"
r, g, b = s[0:2], s[2:4], s[4:6]
'
1000000 loops, best of 3: 1.2 usec per loop

Numpy比单个查找的首选解决方案差:

$ python -m timeit -s 'import numpy as np; s="aabbccdd"' 'a = np.fromstring(s.decode("hex"), dtype="uint32"); a.dtype = "uint8"; list(a)'
100000 loops, best of 3: 5.14 usec per loop
$ python -m timeit -s 's="aabbcc";' '[int(s[i:i+2], 16) / 255. for i in xrange(0, len(s), 2)]'
100000 loops, best of 3: 2.41 usec per loop

但是如果你一次做几个转换,numpy要快得多:

^{pr2}$

在我的电脑上,Numpy对于大于2的批处理程序更快。您可以通过将a.shape设置为(number_of_colors, 4)来轻松地对值进行分组,尽管这会使tolist方法慢50%。在

实际上,大部分时间都花在将数组转换为列表上。根据您希望如何处理结果,您可以跳过这一步,并获得一些好处:

$ python -m timeit -s 'import numpy as np; s="aabbccdd" * 100' 'a = np.fromstring(s.decode("hex"), dtype="uint32"); a.dtype = "uint8"; a.shape = (100,4)'
100000 loops, best of 3: 6.76 usec per loop

相关问题 更多 >