Considere esto:

>>> res = [list(g) for k,g in itertools.groupby('abbba')]                                                                                                                                                           

>>> res                                                                                                                                                                                                             
[['a'], ['b', 'b', 'b'], ['a']]

Y luego esto:

>>> res = [g for k,g in itertools.groupby('abbba')]

>>> list(res[0])
[]

Estoy desconcertado por esto. ¿Por qué devuelven resultados diferentes?

2
Josh 18 jul. 2020 a las 19:32

1 respuesta

La mejor respuesta

Este es el comportamiento esperado. La documentación es bastante clara de que el iterador del agrupador es compartido con el iterador groupby:

El grupo devuelto es en sí mismo un iterador que comparte el iterable subyacente con groupby (). Debido a que la fuente es compartida, cuando se avanza el objeto groupby (), el grupo anterior ya no es visible. Entonces, si esos datos se necesitan más adelante, deben almacenarse como una lista ...

La razón por la que obtiene listas vacías es que el iterador ya está consumido en el momento en que intenta iterar sobre él.

import itertools 

res = [g for k,g in itertools.groupby('abbba')]

next(res[0])
# Raises StopIteration: 
2
Mark M 18 jul. 2020 a las 16:40