Объект groupby исчезает после операции со списком - PullRequest
4 голосов
/ 28 июня 2019

Я пытаюсь решить проблему кодирования длины строки, и после выполнения операции groupby & list мой объект groupby каким-то образом исчез.

import itertools
s = 'AAAABBBCCDAA'
for c, group in itertools.groupby(s):
    print(list(group))
    print(list(group))

Мой вывод

['A', 'A', 'A', 'A']
[]
['B', 'B', 'B']
[]
['C', 'C']
[]
['D']
[]
['A', 'A']
[]

, поэтомудля каждого цикла две команды печати дают разные результаты.

Кто-нибудь может помочь объяснить, что я сделал не так?

Ответы [ 2 ]

3 голосов
/ 28 июня 2019

Потому что есть генераторы, после их использования они ушли:

>>> a = iter([1, 2, 3])
>>> list(a)
[1, 2, 3]
>>> list(a)
[]

Чтобы сохранить их:

import itertools
s = 'AAAABBBCCDAA'
for c, group in itertools.groupby(s):
    l = list(group)
    print(l)
    print(l)

Выход:

['A', 'A', 'A', 'A']
['A', 'A', 'A', 'A']
['B', 'B', 'B']
['B', 'B', 'B']
['C', 'C']
['C', 'C']
['D']
['D']
['A', 'A']
['A', 'A']
1 голос
/ 28 июня 2019

Функция groupby возвращает итератор, который используется при вашем вызове list(group).

"Возвращенная группа сама является итератором, который разделяет базовую итерацию с groupby (). Потому что источникshared, когда объект groupby () расширен, предыдущая группа больше не видна. " * Docs 1006 *.

...