代码之家  ›  专栏  ›  技术社区  ›  hancho

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

  •  1
  • hancho  · 技术社区  · 8 年前

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

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

    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的数组。我正在努力摆脱在几周内将我的内部列表理解力变平的附加步骤。 [[d + 1] * 7 for d in range(len(weeks))]

    谢谢你的帮助。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Martijn Pieters    8 年前

    您基本上是为 weeks 顺序,直到一年的总天数,因此这也适用:

    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 引用添加重复,循环将忽略这些值。

    两个版本都不需要 周数 存在。