6

我有一个看起来像这样的列表:

[[3, 4.6575, 7.3725], 
[3, 3.91, 5.694],
[2, 3.986666666666667, 6.6433333333333335],
[1, 3.9542857142857137, 5.674285714285714],....]

我想将第一个元素的值相等的行的所有值相加(实际上取平均值......但它是一个细节)。这意味着在上面的示例中,前两行将加在一起。

[[3, 8.5675, 13.0665],
[2, 3.986666666666667, 6.6433333333333335],
[1, 3.9542857142857137, 5.674285714285714],....]

这意味着第一个值应该是唯一的。

我想通过查找第一个值等于例如 1 的所有“行”并将它们加在一起来做到这一点。我现在的问题是,如何找到第一个值等于某个值的所有行。

4

3 回答 3

3

这应该有效:

lst = [[3, 4.6575, 7.3725], 
       [3, 3.91, 5.694],
       [2, 3.986666666666667, 6.6433333333333335],
       [1, 3.9542857142857137, 5.674285714285714]]

# group the values in a dictionary
import collections
d = collections.defaultdict(list)
for item in lst:
    d[item[0]].append(item)
# find sum of values
for key, value in d.items():
    print [key] + map(sum, zip(*value)[1:])

或者,更清洁一点,使用itertools.groupby

import itertools
groups = itertools.groupby(lst, lambda i: i[0])
for key, value in groups:
    print [key] + map(sum, zip(*value)[1:])

输出,在这两种情况下:

[1, 3.9542857142857137, 5.674285714285714]
[2, 3.986666666666667, 6.6433333333333335]
[3, 8.567499999999999, 13.0665]

如果要计算平均值而不是总和,只需定义自己的mean函数并将该函数而不是函数传递summap

mean = lambda x: sum(x) / float(len(x))
map(mean, zip...)
于 2013-07-19T08:40:33.713 回答
2

在 Python 中有很多方法可以做这样的事情。如果您的列表被调用a,您可以进行列表理解以获取第一列等于的行索引value

rows = [i for i in range(0,len(a)) if a[i][0]==value]

但是,我确信有整个库可以解析 X 维度中的数组或列表以检索各种统计数据。大量可用的库是使 Python 开发成为如此美妙体验的众多因素之一。

于 2013-07-19T08:28:35.590 回答
1
>>> from itertools import groupby
>>> alist
[[3, 4.6575, 7.3725], [3, 3.91, 5.694], [2, 3.986666666666667, 6.6433333333333335], [1, 3.9542857142857137, 5.674285714285714]]
>>> [reduce(lambda x, y: [key, x[1]+y[1], x[2]+y[2]], group) for key, group in groupby(alist, lambda x:x[0])]
[[3, 8.567499999999999, 13.0665], [2, 3.986666666666667, 6.6433333333333335], [1, 3.9542857142857137, 5.674285714285714]]

我只是提供了另一种使用列表理解的解决方案,groupby并且reduce. reduce必须从functoolspy3.x中导入。

于 2013-07-19T08:54:58.387 回答