自学《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)]
头篇文章,希望说清楚了,对大家有帮助~