我正在尝试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]
如何编写生成器表达式来完成此操作?有没有更好的方法来获得理想的结果?
答案 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))
或只是循环生成器。