Доступ к элементу генератора при применении функции карты - PullRequest
0 голосов
/ 27 июня 2019

Скажите, что у меня есть функция:

def plus(x):
    return [x+1, x+2]

и некоторые данные, к которым я хотел бы применить вышеуказанную функцию:

 data=(i for i in range(5)) #large, don't fit in ram

Я перебираю результатыфункции карты.Я пытаюсь получить значение переменной данных, когда результаты функции карты соответствуют определенной категории:

for result in map(plus, data) or []:
     if result >3:
        print(f"{result} -xx")

, как я могу получить доступ к элементу генератора, который соответствует этим критериям (отмечен выше как xx)?Один из способов, который я могу придумать, - добавить переменную x в функции plus обратно к возвращаемому списку, но это кажется излишним.

1 Ответ

1 голос
/ 27 июня 2019

Функция itertools.tee делает подобные вещи практичными (и использование ее для параллельной итерации - единственный случай, когда она действительно экономит память, поэтому это идеальный случай для этого):

import itertools

# Make two iterators that will each produce the original data once
# When the value has been produced by one iterator, it is cached internally;
# when the second iterator produces it, it's discarded
data, data2 = itertools.tee(data)

# Iterate original data and mapped data in parallel
for x, result in zip(data, map(plus, data2)):
     if result >3:
        print(f"{result} {x}")

Обратите внимание, что я удалил or [], потому что он гарантированно бессмысленен; map объекты всегда правдивы, так что вы всегда будете повторять объект map (который отлично работает, даже если он оказывается пустым).

...