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, но не могу найти ничего, что, по-видимому, обеспечило бы длину группы.
Ответы
Ответ 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
.