Подтвердить что ты не робот

Python: как получить длину itertools _grouper

Я работаю с Python itertools и с помощью groupby сортирую кучу пар последним элементом. Я получил его, чтобы сортировать, и я могу перебирать группы в порядке, но мне очень хотелось бы иметь возможность получить длину каждой группы без необходимости повторять каждую из них, увеличивая счетчик.

Проект представляет собой кластер некоторых точек данных. Я работаю с парами (numpy.array, int), где массив numpy является точкой данных, а integer - это метка кластера

Здесь мой соответствующий код:

data = sorted(data, key=lambda (point, cluster):cluster)
for cluster,clusterList in itertools.groupby(data, key=lambda (point, cluster):cluster):
    if len(clusterList) < minLen:

В последней строке "если len (clusterList) < minLen: ', я получаю сообщение об ошибке, что объект типа' itertools._grouper 'не имеет len().

Я просмотрел операции, доступные для _groupers, но не могу найти ничего, что, по-видимому, обеспечило бы длину группы.

4b9b3361

Ответ 1

Просто потому, что вы называете это clusterList не делает его списком! Это в основном ленивый итератор, возвращающий каждый элемент по мере необходимости. Вы можете преобразовать его в список, подобный этому:

clusterList = list(clusterList)

Или сделайте это и получите его длину за один шаг:

length = len(list(clusterList))

Если вы не хотите использовать память для создания списка, вы можете сделать это вместо:

length = sum(1 for x in clusterList)

Имейте в виду, что исходный итератор будет потребляться полностью путем преобразования его в список или с помощью формулировки sum().

Ответ 2

clusterList iterable, но это не list. Иногда это может немного запутать. Вы можете сделать цикл for над clusterList, но вы не можете делать другие вещи над ним (срез, len и т.д.).

Исправить: назначить результат list(clusterList) на clusterList.