在python列表中计算重复元组的最有效方法

在python列表中计算重复元组的最有效方法,python,list,tuples,Python,List,Tuples,我有一个超过1亿元组的列表,其中包含如下关键值元素: list_a = [(1,'a'), (2,'b'), (1,'a'), (3,'b'), (3,'b'), (1,'a')] list_b = [(1,'a', 3), (2, 'b', 1), (3, 'b', 2) ] 我需要输出第二个列表,如下所示: list_a = [(1,'a'), (2,'b'), (1,'a'), (3,'b'), (3,'b'), (1,'a')] list_b = [(1,'a', 3), (2,

我有一个超过1亿元组的列表,其中包含如下关键值元素:

list_a = [(1,'a'), (2,'b'), (1,'a'), (3,'b'), (3,'b'), (1,'a')]
list_b = [(1,'a', 3), (2, 'b', 1), (3, 'b', 2) ]
我需要输出第二个列表,如下所示:

list_a = [(1,'a'), (2,'b'), (1,'a'), (3,'b'), (3,'b'), (1,'a')]
list_b = [(1,'a', 3), (2, 'b', 1), (3, 'b', 2) ]
元组中的最后一个元素是该元组列表中重复项的计数。列表中的顺序并不重要

然后,我写了以下代码:

import collections

list_b = []

for e, c in collections.Counter(list_a).most_common():
    list_b.append("{}, {}, {}".format(e[0], e[1], c))

使用1000个元组运行大约持续2秒。。。计算出超过1亿需要多长时间。有没有加快速度的想法?

您的瓶颈是使用
list.append
方法,因为它在本机python上运行,而不是在固有的C代码上运行,所以执行速度会慢得多

您可以选择使用列表理解,这样会更快:

c = Counter(list_a)
result = [(*k, v) for k, v in c.items()]

在我的机器上的1000个项目列表上运行此操作,速度非常快。

collections.Counter()
是一个非常好的工具。您可以通过跳过
for
循环中的字符串格式,直接形成3元组来加快速度。@AbbeGijly是的,您是对的,但是您认为这会是一个显著的改进吗?我的意思是,在创建列表之后,我仍然需要对其进行格式化。您还可以将
最常见的()
替换为
。items()
。这将跳过列表上不必要的排序操作。请检查:您会有一些想法。@AbbeGijly好主意!看来你的观点是合理的。我已经用100000个元组进行了测试,您的想法减少了27%的运行时间。我将尝试使用一个更大的数字,然后让您知道。基准测试后items()的速度将提高24%。避免append()可以减少近8%。消除格式()只减少3%。