Вложенные лямбда-выражения в Python Map и Reduce - PullRequest
2 голосов
/ 23 февраля 2011

Мой код в настоящее время содержит как часть условия цикла while:

reduce(operator.or_, map(lambda y: reduce(operator.or_, map(lambda x: x[0] == y, data[testedoffset:])), footers))

Его цель - проверить, содержит ли данный фрагмент экземпляра Python array.array одно из нескольких определенных значений байтов.

Я получаю ошибку:

NameError: global name 'y' is not defined

Так что я почти уверен, что это проблема с ограничениями. Но я не могу придумать способ сделать то, что я хочу отсюда.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Я вижу, вы нашли ответ самостоятельно, но пока вы здесь ... Этот код действительно может использовать некоторую работу.

Я не совсем уверен, почему вы отображаете это выражение на основе data[testedoffset:] в последовательности footers. Это, кажется, не имеет никакого эффекта, если только у вашего __getitem__ нет побочных эффектов.

Но вся эта вещь map + reduce + operator.or_ дает мне воли.

Попробуйте что-то еще подобное:

y = 'whatever'
if any(x[0] == y for x in data[offset:]):
    print "yep, it's in there"
0 голосов
/ 23 февраля 2011

Это, конечно, не проблема с областью видимости, и это явно непифоническое выражение. Вот моя попытка понять это, и я обнаружил, что вам нужно передать y лямбда-выражению.

reduce(operator.or_,
       map(lambda y: reduce(operator.or_, map(lambda x: x[0] == y, data[testedoffset:]))
                ,#Where is y
           , footers))
...