生成器表达式,访问迭代器

时间:2014-02-21 17:48:36

标签: python python-2.7 generator generator-expression

我正在尝试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]

如何编写生成器表达式来完成此操作?有没有更好的方法来获得理想的结果?

2 个答案:

答案 0 :(得分:0)

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

re.sub(r'[\x7e\x7d\x11\x13]', b'\x7d\\1', frameData)

答案 1 :(得分:0)

使用生成器功能

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

我用to set替换了你的转义值列表,以便更快地查找。

你可以在函数上调用list()

escaped = list(class.escapeFrameData(frameData))

或只是循环生成器。