Python 3.x 如何通过在Python中删除nan来查找列表中的中间值

Python 3.x 如何通过在Python中删除nan来查找列表中的中间值,python-3.x,Python 3.x,我想做一个函数,返回列表的中值列表,下面是我的示例: y=[1,3,3,4,5,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,0,1,4,5,2,4] 我想计算每一组元素的中位数,在我的情况下,答案是 [3.0、2.0、3.5、4.0] 我编写了下面的函数,但我确信这不是最具python风格的方式,特别是当我收到一条警告时,我正在计算(“空切片的平均值”) 有没有其他可行的方法来做同样的操作。这个怎么样 >>>

我想做一个函数,返回列表的中值列表,下面是我的示例:

y=[1,3,3,4,5,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,0,1,4,5,2,4]

我想计算每一组元素的中位数,在我的情况下,答案是
[3.0、2.0、3.5、4.0]
我编写了下面的函数,但我确信这不是最具python风格的方式,特别是当我收到一条警告时,我正在计算(“空切片的平均值”)

有没有其他可行的方法来做同样的操作。

这个怎么样

>>> from itertools import groupby
>>> from statistics import median
>>> y=[1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4]
>>> [ median(g) for k,g in groupby(y, lambda x: x!=0) if k ]
[3, 2, 3.5, 4]
>>> 
当你以一种零分割的方式分离元素时,我就这样做了,在这里,
k
对我来说是真的或假的,分组函数,
g
将包含那些当
k
为真时非零的元素,反之亦然,我使用列表理解来过滤这些元素,如下图所示

>>> [ list(g) for k,g in groupby(y, lambda x: x!=0) if k ]
[[1, 3, 3, 4, 5], [1, 2, 2, 4, 5], [1, 3, 4, 5, 4, 2], [1, 4, 5, 2, 4]]
>>> 
然后我用它来得到想要的结果

如果你愿意,也可以使用
numpy
,但这可能有点过分了

>>> [ numpy.median(list(g)) for k,g in groupby(y, lambda x: x!=0) if k ]
[3.0, 2.0, 3.5, 4.0]
>>>   

这里有一个更简洁的方法,尽管可以说可读性较差

这将使用根据给定键函数的结果对连续元素进行分组的方法。在这种情况下,关键函数是元素是否为零

y = [1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4]
groups = [list(group) for is_zero, group in 
          itertools.groupby(y, lambda a: a == 0) if not is_zero]]
medians = [np.median(group) for group in groups]

非常感谢,它似乎起作用了,我需要进一步检查itertools
y = [1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4]
groups = [list(group) for is_zero, group in 
          itertools.groupby(y, lambda a: a == 0) if not is_zero]]
medians = [np.median(group) for group in groups]