我想创建一个返回列表中值列表的函数,下面是我的例子:
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]
我想计算每组元素的中位数,在我的情况下,答案将不为零
[3.0, 2.0, 3.5, 4.0]
我写了下面这个函数,但我确信它并不是最特别的pythonic方式,我收到一个警告,我正在计算("空切片的平均值")
def my_func(list1):
median = 0
list2 = []
total = []
for i in list1:
if i != 0:
total.append(i)
else:
median = np.median(total)
list2.append(median)
newList = [i for i in list2 if not math.isnan(i)]
total = []
return (newList)
还有其他实用的方法可以进行相同的操作。
答案 0 :(得分:2)
这个怎么样
>>> 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]
>>>
当您将元素分成零中的某种分割时,我会使用itertools.groupby来执行此操作,此处k
对应于我的分组函数g
将为true或false {{ 1}}将包含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]]
>>>
然后我使用statistics.median来获得欲望结果
如果您愿意,可以使用或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]
>>>
答案 1 :(得分:0)
这是一种更简洁的方式,虽然可读性较差。
这使用itertools.groupby按给定键函数的结果对连续元素进行分组。在这种情况下,关键功能是元素是否为零。
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]