计算嵌套列表中相等子列表的出现次数的更快方法是什么?

Léo*_*ert 9 python

我有一个Python列表,我希望(尽可能快地:非常重要......)在每个子列表中附加它在嵌套列表中出现的时间.

我已经用一些pandas数据框完成了这个,但是这看起来非常慢,我需要非常大规模地运行这些行.我完全愿意牺牲好读的代码来实现高效的代码.

所以例如我的嵌套列表在这里:

l = [[1, 3, 2], [1, 3, 2] ,[1, 3, 5]]
Run Code Online (Sandbox Code Playgroud)

我需要:

res = [[1, 3, 2, 2], [1, 3, 5, 1]]
Run Code Online (Sandbox Code Playgroud)

编辑

订单res根本无关紧要.

Dan*_*ejo 10

如果顺序无关紧要,您可以使用collections.Counter扩展的可迭代解包,作为@Chris_Rands解决方案的变体:

from collections import Counter

l = [[1, 3, 2], [1, 3, 2] ,[1, 3, 5]]

result = [[*t, count] for t, count in Counter(map(tuple, l)).items()]
print(result)
Run Code Online (Sandbox Code Playgroud)

产量

[[1, 3, 5, 1], [1, 3, 2, 2]]
Run Code Online (Sandbox Code Playgroud)


Chr*_*nds 8

这是一个很奇怪的输出需要,但它当然是可能的.我建议使用collections.Counter(),毫无疑问,其他人会提出不同的建议,timeit风格比较会显示特定数据集的最快速度:

>>> from collections import Counter
>>> l = [[1, 3, 2], [1, 3, 2] ,[1, 3, 5]]
>>> [list(k) + [v] for k, v in Counter(map(tuple,l)).items()]
[[1, 3, 2, 2], [1, 3, 5, 1]]
Run Code Online (Sandbox Code Playgroud)

需要注意的插入顺序保存之前CPython的3.6/Python的3.7,使用OrderedCounter配方.