python : groupby 结果浅解,&之后的 y_list=[v for _,v in y]

 

自学《python编程从入门到实践》的第16章的16.2.6 收盘价均值,讲解得不够详细,幸而在论坛看到了相关文章
”Python编程:从入门到实践 json练习详解~~“,解决了大部分困惑。非常感谢!

唯一还是不清楚的是   y_list = [v for _, v in y]这句,特别是那个下划线

    for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):
        y_list = [v for _, v in y]

要明白这句,其实玄机在上句。我们首先要搞明白groupby 返回的结果类型,然后才用列表解析去相应处理。

groupby 返回结果中,x 是x_data 的有序唯一值,而 y 已不单纯再是个列表值,而是个groupby 对象,包含了x,y 值的组合。不能直接打印,但可以取出来再操作, 感觉像个元组列表。详见实验:

from itertools import groupby

xlist = [1,2,1,4]
ylist = [2,3,4,2]
   
xy_map =[]
for x, y in groupby(sorted(zip(xlist, ylist)), key=lambda _: _[0]):
    print ("\nx:",x)
   # print ("y:",y)#y is a groupby object which can't directly print
       
    y_list = [v for w,v in y]
    print ("y_list:",y_list)
    xy_map.append([x, sum(y_list)/len(y_list)])
print ("xy_map:",xy_map,"\n")

"sorted(zip(xlist, ylist)), key=lambda _: _[0]"之后的结果类似:

[1,2],[1,4],[2,3],[4,2]

再 groupby处理后 x,y的结果类似:
1,[(1, 2), (1, 4)]

2,[(2, 3)]

3,[(4, 2)]

【敲黑板】看y的值。。。

所以

y_list = [v for _,v in y]

等同于 y_list = [v for w,v in y]

只是要跳过前面部分,取groupby y 值中后面那部分,即返回v赋值给y_list。如[(1, 2), (1, 4)]中的 2,4,[(2, 3)]中的3

延申,换个顺序:x_list = [v for v,_ in y]就会返回[(1, 2), (1, 4)]中的 1,1,[(2, 3)]中的2

打印结果如下:

x: 1

y_list: [2, 4]

x: 2

y_list: [3]

x: 4

y_list: [2]

xy_map: [[1, 3.0], [2, 3.0], [4, 2.0]]

 

进一步实验也验证了这个理解,比如不分-,v 或者w,v(这里w只是随便起的名字,你叫他test或什么效果一样),直接取y的值打印

for x, y in groupby(sorted(zip(xlist, ylist)), key=lambda _: _[0]):
    print ("x:",x)

    y_list = [v for v in y]
    print ("y_list_2:",y_list)

 结果如下:

x: 1

y_list_2: [(1, 2), (1, 4)]

x: 2

y_list_2: [(2, 3)]

x: 4

y_list_2: [(4, 2)]

 

 

头篇文章,希望说清楚了,对大家有帮助~

 

你可能感兴趣的:(python : groupby 结果浅解,&之后的 y_list=[v for _,v in y])