我有一个如下所示的列表:
[[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的所有“行”并将它们加在一起来实现这一点。我现在的问题是,如何找到第一个值等于某个值的所有行。
答案 0 :(得分:2)
在Python中有很多方法可以做这样的事情。
如果您的列表名为a
,则可以进行列表推导以获取第一列等于value
的行索引:
rows = [i for i in range(0,len(a)) if a[i][0]==value]
但是,我确信有完整的库可以解析X维中的数组或列表,以便在那里检索各种统计数据。可用的大量库是使用Python开发这么棒的体验的众多因素之一。
答案 1 :(得分:2)
这应该有效:
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
函数,然后将其中的sum
函数传递给map
:
mean = lambda x: sum(x) / float(len(x))
map(mean, zip...)
答案 2 :(得分: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
提供另一种解决方案。必须从py3.x中的reduce
导入functools
。