Я думаю, что понимания списка могут дать мне это, но я не уверен: какие-либо изящные решения в Python (2.6) в целом для выбора уникальных объектов в списке и обеспечении количества?
(Я определил __eq__
определить уникальность на моем определении объекта).
Таким образом на земле RDBMS, чем-то вроде этого:
CREATE TABLE x(n NUMBER(1));
INSERT INTO x VALUES(1);
INSERT INTO x VALUES(1);
INSERT INTO x VALUES(1);
INSERT INTO x VALUES(2);
SELECT COUNT(*), n FROM x
GROUP BY n;
Который дает:
COUNT(*) n
==========
3 1
1 2
Так, вот мой эквивалентный список в Python:
[1,1,1,2]
И я хочу тот же вывод, как ВЫБОР SQL дает выше.
Править: Пример, который я дал здесь, был упрощен, я на самом деле обрабатываю списки пользовательских экземпляров объектов: только для полноты я включаю дополнительный код, я должен был заставить все это работать:
import hashlib
def __hash__(self):
md5=hashlib.md5()
[md5.update(i) for i in self.my_list_of_stuff]
return int(md5.hexdigest(),16)
__hash__
метод был необходим для получения set
преобразование в работу (я выбрал идею понимания списка, которая работает в 2,6 [несмотря на то, что я изучил это, включает неэффективность (см. комментарии) - мой набор данных является достаточно небольшим для этого не быть проблемой]). my_list_of_stuff
выше список (Строк) на моем определении объекта.
regebro Lennart предоставил хороший одноклассник , который делает то, что вы хотите:
>>> values = [1,1,1,2]
>>> print [(x,values.count(x)) for x in set(values)]
[(1, 3), (2, 1)]
как S.Lott justions , по умолчанию может сделать то же самое.
>>> from collections import Counter
>>> Counter([1,1,1,2])
Counter({1: 3, 2: 1})
Счетчик Доступно только в PY3.1, наследует от Dict
.
Вы можете использовать Groupby
из модуля модуля ITERTOOLS
:
Сделайте итератор, который возвращает последовательные клавиши и группы из итерации. Ключ представляет собой функцию вычисления ключевого значения для каждого элемента. Если не указано или нет, никто, ключевое значение по умолчанию для функции идентификации и возвращает элемент без изменений. Как правило, ее необходимость уже быть отсортированы на одной и той же функции ключей.
>>> a = [1,1,1,2]
>>> [(len(list(v)), key) for (key, v) in itertools.groupby(sorted(a))]
[(3, 1), (1, 2)]
Я бы предположил, что его время выполнения хуже, чем решение
, растворов . Silenghost или S.Lott, поскольку он должен сортировать входную последовательность, но вы должны сроки самостоятельно. Это понимание списка, хотя. Это должно быть быстрее, чем решение Адама Бернье, поскольку ему не нужно делать повторяющиеся линейные сканирования входной последовательности. При необходимости сортировка сортировала
вызов , сортировав входную последовательность входной последовательности.
нелегко выполняется в виде понимания списка.
from collections import defaultdict
def group_by( someList ):
counts = defaultdict(int)
for value in someList:
counts[value.aKey] += 1
return counts
Это очень пифитоновый раствор. Но не понимание списка.