我有一个像这样的列表
[[name1, 10.10], [name2, 12.12], [name1, 9.90], [name3, 22.20], [name3, 7.70]]
我想搜索具有相同第一个元素的单个列表的较大列表,然后平均第二个元素,然后将新的平均值附加到新列表,如下所示:
[[name1, 10.00], [name2, 12.12], [name3, 14.95]]
问题是我不知道如何搜索列表来执行此操作。我对python很新,有人可以帮忙吗?
答案 0 :(得分:0)
您可以使用字典存储具有相应值的每个名称:
>>> from __future__ import division
>>> l=[['name1', 10.1], ['name2', 12.12], ['name1', 9.9], ['name3', 22.2], ['name3', 7.70]]
>>> d={}
>>> for i in l:
... d.setdefault(i[0],[]).extend(i[1:])
...
>>> d
{'name2': [12.12], 'name3': [22.2, 7.7], 'name1': [10.1, 9.9]}
>>> [[i,sum(j)/len(j)] for i,j in d.items()]
[['name2', 12.12], ['name3', 14.95], ['name1', 10.0]]
Note
如果您的子列表中有超过1个数字,则此答案有效!!
但是对于这种情况,我在编辑之前写的你可以这样做:
>>> from __future__ import division
>>> l=[['name1', 10.1], ['name2', 12.12], ['name1', 9.9], ['name3', 22.2], ['name3', 7.70]]
>>> d={}
>>> for i,j in l:
... d.setdefault(i,[]).append(j)
...
>>> d
{'name2': [12.12], 'name3': [22.2, 7.7], 'name1': [10.1, 9.9]}
>>> [[i,sum(j)/len(j)] for i,j in d.items()]
[['name2', 12.12], ['name3', 14.95], ['name1', 10.0]]
答案 1 :(得分:0)
您可以使用简单的函数循环遍历项目:
def averageItems(items):
averages = {}
for name, data in items:
averages.setdefault(name, []).append(data)
for name, data in averages.items():
averages[name] = sum(data) / len(data)
return averages
然后使用您的清单:
data = [[name1, 10.10], [name2, 12.12], [name1, 9.90], [name3, 22.20], [name3, 7.70]]
dataAverages = averageItems(data) # {name3: 14.95, name2: 12.12, name1: 10.0}
答案 2 :(得分:0)
.setdefault()
字典方法构建一个值为数字列表的字典。sum
和len
构建列表以计算平均值。使用ipython
解释器
In [1]: l = [['name1', 10.10], ['name2', 12.12], ['name1', 9.90], ['name3', 22.20], ['name3', 7.70]]
In [2]: d = {}
In [3]: for k, v in l: d[k]=d.setdefault(k,[])+[v]
In [4]: [[k,sum(d[k])/len(d[k])] for k in d]
Out[4]: [['name2', 12.12], ['name3', 14.95], ['name1', 10.0]]
In [5]: del d
In [6]:
由Kevin's comment to the OP提示有关保留原始列表中标签顺序的最终要求,我建议您使用OrderedDict
模块中的collections
In [19]: from collections import OrderedDict
In [20]: d = OrderedDict()
In [21]: for k, v in l: d[k]=d.setdefault(k,[])+[v]
In [22]: [[k,sum(d[k])/len(d[k])] for k in d]
Out[22]: [['name1', 10.0], ['name2', 12.12], ['name3', 14.95]]
答案 3 :(得分:0)
您可以使用collections.defaultdict将每个名称的所有分数存储在一个列表中,然后使用statistics.mean如果您有python> = 3.4来计算平均值:
from collections import defaultdict
from statistics import mean
l = [['name1', 10.10], ['name2', 12.12], ['name1', 9.90], ['name3', 22.20], ['name3', 7.70]]
details = defaultdict(list)
for name, score in l:
details[name].append(score)
如果你想保持dict结构只是更新值:
for name, scores in details.items():
details[name] = mean(scores)
print(details)
defaultdict(<class 'list'>, {'name3': 14.95, 'name1': 10.0, 'name2': 12.12})
或使用列表理解创建列表:
print([[name ,mean(scores)] for name,scores in details.items()])
[['name1', 10.0], ['name3', 14.95], ['name2', 12.12]]
显然,如果不使用卑鄙,你可以自己简单地计算:
print([[name , sum(scores)/len(scores)] for name,scores in details.items()])
如果订单很重要,请使用collections.OrderedDict:
from collections import OrderedDict
details = OrderedDict()
for name, score in l:
details.setdefault(name,[])
details[name].append(score)
print([[name , sum(scores)/len(scores)] for name,scores in details.items()])
答案 4 :(得分:0)
from collections import defaultdict
from operator import add
d = defaultdict(list)
pairs = [[name1, 10.10], [name2, 12.12], [name1, 9.90], [name3, 22.20], [name3, 7.70]]
for name, val in pairs:
d[name].append(val)
print [(name, reduce(add, vals)/len(vals)) for name, vals in d.items()]
我认为这应该有用,而且它也相当干净。我们创建一个defaultdict并将每个名称的每个值附加到列表中,然后通过添加减少这些值,然后除以长度以获得平均值。