Python - 平均列表中的项目

时间:2015-04-06 21:51:53

标签: python list

我有一个像这样的列表

[[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很新,有人可以帮忙吗?

5 个答案:

答案 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)

  1. 使用.setdefault()字典方法构建一个值为数字列表的字典。
  2. 使用内置sumlen构建列表以计算平均值。
  3. 使用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并将每个名称的每个值附加到列表中,然后通过添加减少这些值,然后除以长度以获得平均值。