Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取值等于某个值的列表中的所有元素_Python - Fatal编程技术网

Python 获取值等于某个值的列表中的所有元素

Python 获取值等于某个值的列表中的所有元素,python,Python,我有一个列表,如下所示: [[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,

我有一个列表,如下所示:

[[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的所有“行”来实现这一点,并将它们相加。我现在的问题是,如何找到第一个值等于某个值的所有行。

在Python中有很多方法可以做到这一点。 如果您的列表名为
a
,您可以进行列表理解,以获取第一列等于
值的行索引:

rows = [i for i in range(0,len(a)) if a[i][0]==value]
然而,我确信有很多库可以解析X维的数组或列表来检索各种统计数据。大量可用的库是使使用Python进行开发成为如此美妙体验的众多因素之一。

这应该是可行的:

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...)

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

我似乎遇到了以下错误:TypeError:“int”对象没有属性“getitem”。您的列表必须是二维的,就像在原始帖子中一样。它是。a的类型是列表,[0]的类型也是列表,[0][0]的类型是整数,[0][1]的类型和[0][1]的类型是浮点数。对我有效(Python 2.7):
>>a=[…复制/粘贴列表…]
>rows=[i代表范围内的i(0,len(a)),如果a[i][0]==3]
[0,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]]