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

 

 

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

 

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值