Rozważ to:

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

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

A potem to:

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

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

Jestem przez to zaskoczony. Dlaczego Czy zwracają różne wyniki?

2
Josh 18 lipiec 2020, 19:32

1 odpowiedź

Najlepsza odpowiedź

To jest oczekiwane zachowanie. Dokumentacja jest całkiem jasna, że Iterator dla Groupera jest wspólny z ierator {x0}}:

Zwracana grupa sama sama jest iterator, który dzieli podstawowy podstawowy z Groupby (). Ponieważ źródło jest udostępniane, gdy obiekt Groupby () jest zaawansowany, poprzednia grupa nie jest już widoczna. Jeśli więc dane są potrzebne później, powinno być przechowywane jako lista ...

Powodem, dla którego otrzymujesz puste listy, ponieważ Iterator jest już spożywany do czasu, który próbujesz przed nim iterować.

import itertools 

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

next(res[0])
# Raises StopIteration: 
2
Mark M 18 lipiec 2020, 16:40