假设我有一个元素列表,例如
[1,1,2,3,3,1,2]
或
["a","a","b","c","c"]
鉴于这样的列表,我想构建一个(不一定是有序的)列表,其中包含每个元素的出现次数。例如,第一个列表应该返回
[3,2,2]
因为列表中有3个,2个,2个和3个三分。第二个应该同样返回
[2,1,2]
在Python中使用它的最佳方法是什么?
答案 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