为何打印操作会导致itertools.pairwise生成的迭代器失效?
为什么取消注释print语句后循环不再工作?
你的代码如下:
import pandas as pd import itertools as it data={ 'X': [1, 2, 3, 4, 5,6,7,8,9,10], 'Y': [5, 4, 3, 2, 1,2,3,4,5,5], 'Cat':["cat","dog",None,None,"dog","dog",None,None,"cat","dog" ] } df = pd.DataFrame(data) x_pairs = it.pairwise(df['X']) y_pairs = it.pairwise(df['Y']) # print(list(x_pairs)) #<--Uncomment this # print(list(y_pairs)) for x, y in zip(x_pairs, y_pairs): print("x",x,"y",y)
问题出在**itertools.pairwise返回的是迭代器**,迭代器有个核心特性:只能被遍历一次,遍历完之后就没有剩余元素了。
- 当你取消注释
print(list(x_pairs))时,list()会把x_pairs里的所有元素一次性取出来转换成列表,这时候x_pairs这个迭代器就被彻底耗尽了,里面再也没有元素。 - 同理
print(list(y_pairs))也会把y_pairs的元素全部取完,让它变成空迭代器。 - 后面的
zip(x_pairs, y_pairs)去遍历两个空迭代器,自然没有任何元素可以循环,所以循环就不工作了。
如果想要既打印内容又能正常执行后续循环,你可以提前把迭代器转换成列表保存:
import pandas as pd import itertools as it data={ 'X': [1, 2, 3, 4, 5,6,7,8,9,10], 'Y': [5, 4, 3, 2, 1,2,3,4,5,5], 'Cat':["cat","dog",None,None,"dog","dog",None,None,"cat","dog" ] } df = pd.DataFrame(data) # 直接转换成列表保存 x_pairs = list(it.pairwise(df['X'])) y_pairs = list(it.pairwise(df['Y'])) print(x_pairs) print(y_pairs) for x, y in zip(x_pairs, y_pairs): print("x",x,"y",y)
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

