我正在尝试创建一个列表理解,这可以改进我已有的列表理解。
我有一个代表一个月长度的数字列表。
months = [35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 28]
我想将这个数组扩展为一个长度为全年的数组,并且该数组中的每个值代表那天(索引)所属的那一周。
目前我这样做有两个列表推导。
weeks = [w for w in range(sum(months)) if w % 7 == 0]
weeks_expanded = [day for week in [[d + 1] * 7 for d in range(len(weeks))] for day in week]
我想知道如何在不使用长度为7的数组的情况下将新内容添加到新列表中7次。我试图摆脱在week_expanded中展开内部列表理解的额外步骤。 [[d + 1] * 7 for d in range(len(weeks))]
感谢您的帮助。
答案 0 :(得分:2)
您基本上为weeks
序列生成每7个数字的序列,直到年总天数,所以这也有效:
weeks = range(0, sum(months), 7)
weeks_expanded
列表只是一系列重复的整数,从1开始,每次重复7次,最多包括sum(months) // 7
,所以你可以这样做:
weeks_expanded = [wn for wn in range(1, (sum(months) // 7) + 1) for __ in range(7)]
这在列表推导中使用嵌套循环,只迭代7次。您还可以使用itertools.product()
iterator将其展平为一个循环:
from itertools import product
weeks_expanded = [wn for wn, __ in product(range(1, (sum(months) // 7) + 1), (None,) * 7)]
这使用7个None
引用的元组来添加重复,然后循环忽略这些值。
这两个版本都不需要存在weeks
。