0

我正在尝试escape通过将它们与另一个项目列表进行检查来检查列表中的项目。我可以过滤列表:

@staticmethod
def escapeFrameData(frameData):
  toEscape = [0x7e, 0x7d, 0x11, 0x13]

  genExpr = (x for x in frameData if x in toEscape)
  for x in genExpr:
    print x

现在我想将转义字符放在找到的每个项目的前面。像这样的东西:

genExpr = (x for i, x in frameData if x in enumerate(toEscape))

for x in genExpr:
  frameData.insert(i-1, 0x7d)
return frameData

需要的行为:

frameData = [0x02, 0x7e, 0x04]
escaped = class.escapeFrameData(frameData)
escaped is now: [0x02, 0x7d, 0x7e, 0x04]

必须如何编写生成器表达式才能完成此操作?有没有更好的方法来获得预期的结果?

4

2 回答 2

0

改用生成器函数

@staticmethod
def escapeFrameData(frameData):
    toEscape = {0x7e, 0x7d, 0x11, 0x13}
    for x in frameData:
        if x in toEscape:
            yield 0x7d
        yield x

我将您的转义值列表替换为一组以加快查找速度。

你会调用list()函数:

escaped = list(class.escapeFrameData(frameData))

或者只是循环生成器。

于 2014-02-21T17:59:26.653 回答
0

这看起来是解决这个问题的一种非常缓慢的方法。假设这些是字节(看起来像),更好的方法是使用字节字符串和re模块。例如,你可以写

re.sub(r'[\x7e\x7d\x11\x13]', b'\x7d\\1', frameData)
于 2014-02-21T17:55:07.147 回答