Выражение генератора, итератор доступа
Я пытаюсь 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
Теперь я хотел бы поместить escape-символ перед каждым найденным предметом. Что-то вроде этого:
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 ответа
Решение
Это выглядит как очень медленный способ решения этой проблемы. Лучшим подходом, предполагая, что это байты (похоже, они есть), было бы использование строк байтов и re
модуль. Например, вы можете написать
re.sub(r'[\x7e\x7d\x11\x13]', b'\x7d\\1', frameData)
Вместо этого используйте функцию генератора:
@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))
или просто зациклите генератор.