我需要在列表中找到元素的频率
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
Run Code Online (Sandbox Code Playgroud)
输出 - >
b = [4,4,2,1,2]
Run Code Online (Sandbox Code Playgroud)
另外我想从a中删除重复项
a = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud) 我认为列表推导可能会给我这个,但我不确定:Python(2.6)中的任何优雅解决方案通常用于选择列表中的唯一对象并提供计数?
(我已经定义了一个__eq__定义我的对象定义的唯一性).
所以在RDBMS-land中,这样的事情:
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;
Run Code Online (Sandbox Code Playgroud)
这使:
COUNT(*) n
==========
3 1
1 2
Run Code Online (Sandbox Code Playgroud)
所以,这是我在Python中的等效列表:
[1,1,1,2]
Run Code Online (Sandbox Code Playgroud)
我想要与上面给出的SQL SELECT相同的输出.
编辑:我给这里的例子是简化的,我其实处理用户定义的对象实例的列表:只是为了完整性我有额外的代码,我需要得到整个事情的工作:
import hashlib
def __hash__(self):
md5=hashlib.md5()
[md5.update(i) for i in self.my_list_of_stuff]
return int(md5.hexdigest(),16)
Run Code Online (Sandbox Code Playgroud)
__hash__需要使用该方法才能使set转换工作(我选择了在2.6中工作的列表理解思想[尽管事实上我知道这涉及效率低下(参见注释) - 我的数据集足够小,因为它不是问题]).my_list_of_stuff上面是我的对象定义中的(字符串)列表.
给定:列表,例如l = [4,4,4,4,5,5,5,6,7,7,7] Todo:获取元素的计数并保持其出现顺序,例如:[( 4,4),(5,3),(6,1),(7,3)]
我可以这样做:
tmpL = [(i,l.count(i)) for i in l]
tmpS = set()
cntList = [x for x in tmpL if x not in tmpS and not tmpS.add(x)]
Run Code Online (Sandbox Code Playgroud)
但有更好的方法吗?我在这里看到了这个链接,但它对计数进行了排序,因此打破了顺序.
编辑:性能不是解决方案的问题,更可取的是内置的东西.