Понимания списка Python могут (идеально) сделать эквивалент 'количества (*) … группа …' в SQL?

Я думаю, что понимания списка могут дать мне это, но я не уверен: какие-либо изящные решения в 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 выше список (Строк) на моем определении объекта.

5
задан SilentGhost 27 January 2010 в 17:58
поделиться

4 ответа

regebro Lennart предоставил хороший одноклассник , который делает то, что вы хотите:

>>> values = [1,1,1,2]
>>> print [(x,values.count(x)) for x in set(values)]
[(1, 3), (2, 1)]

как S.Lott justions , по умолчанию может сделать то же самое.

11
ответ дан 18 December 2019 в 05:33
поделиться
>>> from collections import Counter
>>> Counter([1,1,1,2])
Counter({1: 3, 2: 1})

Счетчик Доступно только в PY3.1, наследует от Dict .

11
ответ дан 18 December 2019 в 05:33
поделиться

Вы можете использовать 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, поскольку он должен сортировать входную последовательность, но вы должны сроки самостоятельно. Это понимание списка, хотя. Это должно быть быстрее, чем решение Адама Бернье, поскольку ему не нужно делать повторяющиеся линейные сканирования входной последовательности. При необходимости сортировка сортировала вызов , сортировав входную последовательность входной последовательности.

4
ответ дан 18 December 2019 в 05:33
поделиться

нелегко выполняется в виде понимания списка.

from collections import defaultdict
def group_by( someList ):
    counts = defaultdict(int)
    for value in someList:
        counts[value.aKey] += 1
    return counts

Это очень пифитоновый раствор. Но не понимание списка.

6
ответ дан 18 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: