2016-12-04 63 views
2

我有一个如下例所示的元组列表。我如何查看列表并找到所有相同的缩写,然后在那里添加分数。希望能够为所有缩写做到这一点。比较类似于元组列表中的值

loop = [('MD', 0.0), ('MD', 0.0), ('MD', 0.0), ('LA', 0.0625), ('LA', 0.0625), ('CA', -0.5), ('CA', -0.5), ('CA', -0.5))] 

回答

5

您可以itertools.groupby()

>>> from itertools import groupby 
>>> loop = sorted(loop, key = lambda x:x[0]) 
>>> {k:sum(list(e[1] for e in v)) for k, v in groupby(loop, lambda x:x[0])} 
{'MD': 0.0, 'CA': -1.5, 'LA': 0.125} 
>>> 

这样做是为了得到平均,低于替换上面的代码:

>>> result = dict() 
>>> for k, v in groupby(loop, lambda x:x[0]): 
...  temp = list(v) 
...  result[k] = sum(i[1] for i in temp)/len(temp) 
... 
>>> result 
{'MD': 0.0, 'LA': 0.0625, 'CA': -0.5} 
>>> 
+0

天才,谢谢!! –

+1

我假设速度不是问题,尽管这里的log(n)开销看起来有点不必要。 –

3

您可以使用Counter作为另一种解决方案。这种方法解决了O(n)时间复杂度的问题。

from collections import Counter 

loop = [('MD', 0.0), ('MD', 0.0), ('MD', 0.0), ('LA', 0.0625), ('LA', 0.0625), ('CA', -0.5), ('CA', -0.5), ('CA', -0.5)] 
c = Counter() 
for k, v in loop: 
    c[k] += v 

print(c) 
# Counter({'LA': 0.125, 'MD': 0.0, 'CA': -1.5}) 
print(dict(c)) 
# {'LA': 0.125, 'CA': -1.5, 'MD': 0.0} 
+0

有没有办法将你创建的总数除以有多少条目。试图获得平均水平。 –

+0

您可以使用另一个计数器来捕获每个项目的出现次数。就像'c2 [k] + = 1'一样。 – amin

+0

非常感谢! –