Я хочу изменить следующий код
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
к этому коду:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
Я получаю ошибку:
неподдерживаемые типы операндов для +: «генератор» и «генератор»
Как объединить два генератора в Python?
Ответы:
Я думаю,
itertools.chain()
должен сделать это.источник
itertools.chain()
не возвращаетtypes.GeneratorType
экземпляр. На всякий случай, точный тип имеет решающее значение.Пример кода:
источник
itertools.chain()
ответу?В Python (3.5 или выше) вы можете сделать:
источник
def chain(*iterables): for iterable in iterables: yield from iterable
(Поместитеdef
иfor
в отдельных строках, когда вы запускаете его.)a
Проверяется только до тех пор, пока всеb
не получено из него, даже если это не итератор. То,TypeError
что яb
не являюсь итератором, появится позже.Простой пример:
источник
itertools.chain()
ответу?itertools.chain
возвращает итератор, а не генератор.chain([1, 2, 3], [3, 4, 5])
?С itertools.chain.from_iterable вы можете делать такие вещи, как:
источник
genny
когда оно уже возвращает генератор.list(itertools.chain.from_iterable(genny(x)))
гораздо более кратким.list
конструктор будет намного более читабельным, чем понимание списка. Ваш метод гораздо более нечитабелен в этом отношении.Здесь используется выражение генератора с вложенным
for
s:источник
Можно также использовать оператор распаковки
*
:ПРИМЕЧАНИЕ: работает наиболее эффективно для «не ленивых» итераций. Может также использоваться с различными видами понимания. Предпочтительный способ для генератора concat будет из ответа от @Uduse
источник
Если вы хотите сохранить генераторы отдельно, но при этом перебирать их одновременно, вы можете использовать zip ():
ПРИМЕЧАНИЕ. Итерация останавливается на более коротком из двух генераторов.
Например:
источник
Допустим, нам нужны генераторы (gen1 и gen 2), и мы хотим выполнить некоторые дополнительные вычисления, которые требуют результата обоих. Мы можем вернуть результат такой функции / вычисления через метод map, который, в свою очередь, возвращает генератор, на котором мы можем зацикливаться.
В этом сценарии функция / расчет должны быть реализованы с помощью лямбда-функции. Сложная часть - это то, что мы стремимся сделать внутри карты и ее лямбда-функции.
Общая форма предлагаемого решения:
источник
Все эти сложные решения ...
просто сделать:
Если вы действительно хотите объединить оба генератора, выполните:
источник
Я бы сказал, что, как было предложено в комментариях пользователя "wjandrea", лучшим решением является
Он не меняет возвращаемый тип и является действительно питоническим.
источник