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, 6.6433333333333335],
[1, 3.9542857142857137, 5.674285714285714],....]

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

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

最佳答案

这应该有效:

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

关于python - 获取列表中所有元素的值等于某个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17741367/

相关文章:

python - Python 上的 %precision 2

python - 将字典列表转换为字典

python - 将大数据集加载到 Pandas Python 中

python - 如何从 kNeighborsClassifier 中查找前 n 个匹配项?

python - 处理 scikit-learn tree.decisiontreeclassifier 中的维度

python - 检查命令行参数的用法。选项

Python 将排序的字典转换为列表?

Python Pandas 条件一阶差分

Python - 打印直到标记(a la PHP)?

python - 在 python 2 和 3 的 spyder 之间切换