Выражение генератора, итератор доступа

Я пытаюсь 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))

или просто зациклите генератор.

Другие вопросы по тегам