构造列表中出现次数的列表

时间:2015-02-26 14:39:52

标签: python list

假设我有一个元素列表,例如

[1,1,2,3,3,1,2]

["a","a","b","c","c"]

鉴于这样的列表,我想构建一个(不一定是有序的)列表,其中包含每个元素的出现次数。例如,第一个列表应该返回

[3,2,2]

因为列表中有3个,2个,2个和3个三分。第二个应该同样返回

[2,1,2]

在Python中使用它的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

  

构建一个(不一定排序的)列表,其中包含每个元素的出现次数

由于您不担心订单,因此您只需使用collections.Counter,就像这样

>>> from collections import Counter
>>> Counter([1, 1, 2, 3, 3, 1, 2]).values()
[3, 2, 2]
>>> Counter(["a", "a", "b", "c", "c"]).values()
[2, 2, 1]

Counter对象只是一个字典,在iterable中找到了键,值将是在iterable中找到的相应键的实际次数。您可以打印Counter对象并像这样检查

>>> Counter([1, 1, 2, 3, 3, 1, 2])
Counter({1: 3, 2: 2, 3: 2})
>>> Counter(["a", "a", "b", "c", "c"])
Counter({'a': 2, 'c': 2, 'b': 1})

由于您只对出现的次数感兴趣,因此我们仅使用values()

答案 1 :(得分:1)

您可以在列表理解中使用list.count,但请注意,您可以使用set来检查成员身份,以便更有效地实现此目标:

>>> l=[1,1,2,3,3,1,2]
>>> [l.count(i) for i in set(l)]
[3, 2, 2]

正如您在以下基准测试中所看到的,使用此配方快7倍

:~$ python -m timeit "l=[1,1,2,3,3,1,2];[l.count(i) for i in set(l)]"
1000000 loops, best of 3: 0.718 usec per loop
:~$ python -m timeit "l=[1,1,2,3,3,1,2];[l.count(i) for i in l]"
1000000 loops, best of 3: 0.97 usec per loop
:~$ python -m timeit "l=[1,1,2,3,3,1,2];from collections import Counter;Counter([1, 1, 2, 3, 3, 1, 2]).values()"
100000 loops, best of 3: 7.27 usec per loop

答案 2 :(得分:1)

最好创建字典(键值)以将每个唯一值作为键及其出现在给定列表中。

>>> l
[1, 1, 2, 3, 3, 1, 2]
>>> import collections
>>> d = collections.Counter(l)
>>> print d
Counter({1: 3, 2: 2, 3: 2})
>>> 

答案 3 :(得分:0)

在'纯'Python中:

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

根据Kasra基准测试的精神,使用简单列表理解的速度是下一个解决方案的两倍,尽管前三种方法中模块导入可能有一些开销:

>>> print ' first: ' ,timeit(stmt=s1, number=100000)
 first:  0.358644798424
>>> print ' second: ' ,timeit(stmt=s2, number=100000)
 second:  0.466576073569
>>> print ' third: ' ,timeit(stmt=s3, number=100000)
 third:  0.685125215535
>>> print ' fourth: ' ,timeit(stmt=s4, number=100000)
 fourth:  0.143517940718