解决方案
使用collections.Counter:from collections import Counter
original_list = [['a', 1], ['b', 1], ['a', 1], ['b', 1], ['b', 2], ['c', 2], ['b', 3]]
result = Counter()
for k, v in original_list:
result.update({k:v})
map(list, result.items())
# [['a', 2], ['c', 2], ['b', 7]]
调查结果
所以,很多答案,观点和赞成票。我甚至白手起家(在过去的两天里,我做出了许多值得更多研究和努力的答案)。鉴于此,我决定至少用从头开始编写的simple script来做一些研究和测试解决方案的性能。不要为了大小而直接在应答中包含代码。
每个函数都是根据其作者命名的,很容易在问题中找到。thefourtheye的解现在等于Mark Reed的一个,并以原始形式计算,即基于itertools.groupby的解的第二个状态。
每一个都进行了多次测试(示例),每个示例依次调用几个函数迭代。我评估了样品时间的最小、最大和标准偏差。
我们开始,进行10次探测测试。testing: thefourtheye, kroolik2, void, kroolik, alko, reed, visser
10 samples
10 iterations each
author min avg max stddev
reed 0.00000 0.00000 0.00000 0.00000
visser 0.00000 0.00150 0.01500 0.00450
thefourtheye 0.00000 0.00160 0.01600 0.00480
thefourtheye2 0.00000 0.00310 0.01600 0.00620
alko 0.00000 0.00630 0.01600 0.00772
void 0.01500 0.01540 0.01600 0.00049
kroolik2 0.04700 0.06430 0.07800 0.00831
kroolik 0.32800 0.34380 0.37500 0.01716
看下面两行:在这一点上,kroolik解决方案被取消资格,因为有了它,任何合理数量的样本*迭代都将执行数小时。这是最后的测试。我手动向ouptut添加了upvots数:testing: thefourtheye, kroolik2, void, kroolik, alko, reed, visser
100 samples
1000 iterations each
author upvotes min avg max stddev
reed [20] 0.06200 0.08174 0.15600 0.01841
thefourtheye [5] 0.06200 0.09971 0.20300 0.01911
visser [6] 0.10900 0.12392 0.23500 0.02263
thefourtheye2 0.25000 0.29674 0.89000 0.07183
alko [11] 0.56200 0.62309 1.04700 0.08438
void [3] 1.50000 1.65480 2.39100 0.18721
kroolik [14] [DSQ]