Python的列表理解(理想情况下)是否可以在SQL中实现“count(*)…groupby…”的等效功能?

2024-04-24 08:54:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为列表理解可能会给我这样的结果,但我不确定:在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;

它给出了:

^{pr2}$

下面是我在Python中的等效列表:

[1,1,1,2]

我想要与上面的sqlselect相同的输出。在

编辑:我在这里给出的例子是简化的,我实际上在处理用户定义对象实例的列表:为了完整起见,我添加了使整个过程正常工作所需的额外代码:

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中有效的列表理解思想[尽管我了解到这涉及到一个低效率(见注释)-我的数据集足够小,所以这不是问题])。^上面的{}是我的对象定义中的(字符串)列表。在


Tags: 对象self列表定义hash解决方案md5领域
3条回答

Lennart Regebro provided a nice one-liner执行您想要的操作:

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

As S.Lott mentions,defaultdict可以做同样的事情。在

>>> from collections import Counter
>>> Counter([1,1,1,2])
Counter({1: 3, 2: 1})

Counter仅在py3.1中可用,继承自dict。在

作为一个列表理解并不容易。在

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

这是一个非常Python式的解决方案。但不是清单理解。在

相关问题 更多 >