列出元素的计数器

Gio*_*Gio 9 python counter list python-3.x pandas

这里是Python的新手。

我正在寻找一种创建列表(输出)的简单方法,该方法在保留索引(?)的同时返回另一个目标列表(MyList)的元素计数。

这就是我想要得到的:

MyList = ["a", "b", "c", "c", "a", "c"]
Output = [ 2 ,  1 ,  3 ,  3 ,  2 ,  3 ]
Run Code Online (Sandbox Code Playgroud)

我找到了解决类似问题的方法。计算列表中每个元素的出现次数。

In  : Counter(MyList)
Out : Counter({'a': 2, 'b': 1, 'c': 3})
Run Code Online (Sandbox Code Playgroud)

但是,这将返回一个不保留索引的Counter对象。

我假设给定了计数器中的键,我可以构造所需的输出,但是我不确定如何进行操作。

额外的信息,我在脚本中导入了熊猫,而MyList实际上是熊猫数据框中的一列。

Myk*_*tko 12

您可以使用函数代替在其他解决方案中的listcomp itemgetter()

from collections import Counter
from operator import itemgetter

MyList = ["a", "b", "c", "c", "a", "c"]

c = Counter(MyList)
itemgetter(*MyList)(c)
# (2, 1, 3, 3, 2, 3)
Run Code Online (Sandbox Code Playgroud)

更新:正如@ALollz在评论中提到的,此解决方案似乎是最快的解决方案。如果OP需要列表而不是元组,则结果必须转换为wih list()

  • 也许`list(itemgetter(* MyList)(c))`与输出匹配,但是我很惊讶这没有更多的选票。似乎是最快的解决方案 (2认同)

yat*_*atu 5

您可以使用list.count方法,该方法将计算每个字符串在中发生的次数MyList。您可以使用列表推导生成带有计数的新列表:

MyList = ["a", "b", "c", "c", "a", "c"]

[MyList.count(i) for i in MyList]
# [2, 1, 3, 3, 2, 3]
Run Code Online (Sandbox Code Playgroud)


ALo*_*llz 5

使用np.unique创造价值计数的字典和映射值。这将很快,尽管不如Counter方法快:

import numpy as np

list(map(dict(zip(*np.unique(MyList, return_counts=True))).get, MyList))
#[2, 1, 3, 3, 2, 3]
Run Code Online (Sandbox Code Playgroud)

中等大小列表的一些时间安排:

MyList = np.random.randint(1, 2000, 5000).tolist()

%timeit [MyList.count(i) for i in MyList]
#413 ms ± 165 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit list(map(dict(zip(*np.unique(MyList, return_counts=True))).get, MyList))
#1.89 ms ± 1.73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit pd.DataFrame(MyList).groupby(MyList).transform(len)[0].tolist()
#2.18 s ± 12.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

c=Counter(MyList)
%timeit lout=[c[i] for i in MyList]
#679 µs ± 2.33 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

c = Counter(MyList)
%timeit list(itemgetter(*MyList)(c))
#503 µs ± 162 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)

较大的清单:

MyList = np.random.randint(1, 2000, 50000).tolist()

%timeit [MyList.count(i) for i in MyList]
#41.2 s ± 5.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit list(map(dict(zip(*np.unique(MyList, return_counts=True))).get, MyList))
#18 ms ± 56.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit pd.DataFrame(MyList).groupby(MyList).transform(len)[0].tolist()
#2.44 s ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

c=Counter(MyList)
%timeit lout=[c[i] for i in MyList]
#6.89 ms ± 22.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

c = Counter(MyList)
%timeit list(itemgetter(*MyList)(c))
#5.27 ms ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)