改进Python列表理解以消除嵌套数组

时间:2018-05-16 16:04:00

标签: python python-3.x list list-comprehension

我正在尝试创建一个列表理解,这可以改进我已有的列表理解。

我有一个代表一个月长度的数字列表。

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

感谢您的帮助。

1 个答案:

答案 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