2014-09-18 1 views
1

Каков наилучший способ подсчета количества элементов в итерации (через итерацию) без сохранения элементов в памяти?Подсчитать количество элементов в истребителе

Прямо сейчас, я просто делаю sum(1 for x in iterable). Я надеялся найти что-то в itertools, но, похоже, ничего не было.

+0

Пожалуйста, не это не дубликат [Получение количества элементов в итератора в Python] (https://stackoverflow.com/questions/ 3345785/get-number-of-elements-in-iterator-in-python), который запрашивает о подсчете без итерации – goncalopp

+1

Возможный дубликат [Есть ли встроенный способ получения длины итерации в python?] (http://stackoverflow.com/questions/390852/is-there-any-built-in-way-to-get-the-length-of-an-iterable-in-python) – simonzack

+1

В качестве опоры эта функция был запрошен лет назад: https://mail.python.org/pipermail/python-list/2003-August/182237.html, но, к сожалению, дискуссия остановилась там, я думаю, что этот вопрос так часто возникает t должен быть добавлен в python. – simonzack

ответ

2

sum(1 for x in iterable) лучший способ. Не все требует специальной функции itertools. :-) Замечу, что верхний проголосовавший ответ на post you claim not to be a dupe of также советует вам использовать это.

Конечно, всегда полезно посмотреть на itertools на всякий случай, и если да, не забудьте проверить recipes section; вы найдете quantify() рецепт, который делает почти то же самое, но с предикатом для фильтрации Iterable:

def quantify(iterable, pred=bool): 
    "Count how many times the predicate is true" 
    return sum(imap(pred, iterable)) 
1

ИМО эта функция должна быть включена в itertools, но это не так.

more-itertools - это пакет, который включает в себя ilen, но может быть немного тяжелым для вашей ситуации. Когда я сталкиваюсь с этим я просто определить часто используемые обходной путь, как ilen:

def ilen(iterable): 
    return sum(1 for _ in iterable) 
+0

Я не думаю, что есть большая ценность в принятии * основных строительных блоков *, которые 'itertools' обеспечивают и обертывают что-то столь же простое, как этот однострочный шрифт в функцию. Потому что функция 'ilen()' в 'more-itertools' делает именно то, что вы включили в свой ответ здесь. –

+0

@MartijnPieters Это может быть полезно, если оно используется достаточно часто, поскольку обходной метод 'sum' не чувствует, что он чист для меня. – simonzack

+0

'more-itertools', кажется, содержит много полезных методов, мне жаль, что я не знал об этом раньше! – goncalopp