Python-да екі генераторға қалай қосылуға болады?

Мен келесі кодты өзгерткім келеді

 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-да екі генераторға қалай қосылуға болады?

99
09 июля '10 в 11:29 2010-07-09 11:29 Гомер Син 09 шілдеден бастап сағат 11: 29-да сұрады. 2010-07-09 11:29
@ 7 жауап

Менің ойымша, itertools.chain() мұны істеуі керек деп ойлаймын.

141
09 июля '10 в 11:30 2010-07-09 11:30 жауап Филиппке 09 шілдеде сағат 11: 30-да беріледі. 2010-07-09 11:30

Код мысалы:

border=0
 from itertools import chain def generator1(): for item in 'abcdef': yield item def generator2(): for item in '123456': yield item generator3 = chain(generator1(), generator2()) for item in generator3: print item 
29
01 апр. жауап Cesio 01 сәуір. 2015-04-01 21:54 '15 at 21:54 2015-04-01 21:54

Itertools.chain.from_iterable арқылы сіз келесі әрекеттерді орындай аласыз:

 def genny(start): for x in range(start, start+3): yield x y = [1, 2] ab = [o for o in itertools.chain.from_iterable(genny(x) for x in y)] print(ab) 
5
15 янв. 15 қаңтарда андрей пэйн жауап берді 2016-01-15 14:19 '16 в 14:19 2016-01-15 14:19

Қарапайым мысал:

 from itertools import chain x = iter([1,2,3]) #Create Generator Object (listiterator) y = iter([3,4,5]) #another one result = chain(x, y) #Chained x and y 
1
23 июля '17 в 12:51 2017-07-23 12:51 жауап 23 тамызда '17 сағат 12:51 2017-07-23 12:51

Python3 + бағдарламасында сіз:

 def concat(a, b): yield from a yield from b 
1
01 дек. Жауап 01 қар. 2017-12-01 14:13 '17 в 14:13 2017-12-01 14:13

Егер сіз генераторларды ажыратқыңыз келсе, бірақ оларды қайталаңыз, zip ():

ЕСКЕРІМ. Итерация екі генератордың қысқа уақытында тоқтайды.

Мысалы:

 for (root1, dir1, files1), (root2, dir2, files2) in zip(os.walk(path1), os.walk(path2)): for file in files1: #do something with first list of files for file in files2: #do something with second list of files 
0
10 авг. жауап DivideByZero 10 тамызда беріледі. 2017-08-10 20:02 '17 те 20: 00-де 2017-08-10 20:02

Мысалы генераторлар (ген1 және ген 2) бар, және біз екі нәтижені талап ететін қосымша есептеуді жүзеге асырғымыз келеді. Біз осындай функцияның / есептеудің нәтижесін карта әдісімен қайтара аламыз, ол өз кезегінде біз байланыстыратын генераторды қайтарады.

Бұл жағдайда функция / есептеу lambda функциясы арқылы іске асырылуы керек. Күрделі бөлік - бұл картадағы және оның лямбда функцияларында істеу.

Ұсынылған шешімнің жалпы формасы:

 def function(gen1,gen2): for item in map(lambda x, y: do_somethin(x,y), gen1, gen2): yield item 
0
06 нояб. Жауап Mahdi Ghelichi 06 қараша 2017-11-06 00:57 '17 at 0:57 2017-11-06 00:57

туралы сұрақтар немесе Сұрақ қою