万千封印
第一个问题是如何高效地循环度过工作日。一个干净的解决方案是使用itertools.cycle().以下将生成无限重复的工作日序列。import itertoolsweekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']itertools.cycle(weekdays)zip()当最短输入可迭代用完时,该函数将停止。现在我们有无限的工作日序列,最短的输入将是八千行数据。>>> import itertools>>> weekdays = ['Sat','Sun','Mon','Tue','Wed','Thu','Fri']>>> data = [(2000, 1, 1, 1, 336), (2000, 1, 1, 2, 335), (2000, 1, 1, 1, 334), (2000, 1, 1, 2, 333), (2000, 1, 1, 1, 332), (2000, 1, 1, 2, 331), (2000, 1, 1, 1, 330), (2000, 1, 1, 2, 329), (2000, 1, 1, 1, 328), (2000, 1, 1, 2, 327)]>>> list(zip(data, itertools.cycle(weekdays)))[((2000, 1, 1, 1, 336), 'Sat'), ((2000, 1, 1, 2, 335), 'Sun'), ((2000, 1, 1, 1, 334), 'Mon'), ((2000, 1, 1, 2, 333), 'Tue'), ((2000, 1, 1, 1, 332), 'Wed'), ((2000, 1, 1, 2, 331), 'Thu'), ((2000, 1, 1, 1, 330), 'Fri'), ((2000, 1, 1, 2, 329), 'Sat'), ((2000, 1, 1, 1, 328), 'Sun'), ((2000, 1, 1, 2, 327), 'Mon')]最后,为了获取内部元组中的工作日,我们可以在列表理解中创建新的元组。>>> [t + (day,) for t, day in zip(data, itertools.cycle(weekdays))][(2000, 1, 1, 1, 336, 'Sat'), (2000, 1, 1, 2, 335, 'Sun'), (2000, 1, 1, 1, 334, 'Mon'), (2000, 1, 1, 2, 333, 'Tue'), (2000, 1, 1, 1, 332, 'Wed'), (2000, 1, 1, 2, 331, 'Thu'), (2000, 1, 1, 1, 330, 'Fri'), (2000, 1, 1, 2, 329, 'Sat'), (2000, 1, 1, 1, 328, 'Sun'), (2000, 1, 1, 2, 327, 'Mon')]这里,t是与每行数据关联的元组,day是工作日,并且语法t + (day,)创建通过将数据元组与工作日组合形成的新元组。