循环更改大列表中的元素(一次 6 个)并为每次迭代创建一个新变量

Loop to change elements in large list (6 at a time) and create a new variable for each iteration

我正在使用 plotly 制作风向玫瑰图,每个月使用下拉菜单绘制。我想使用循环稍微清理一下我的代码,但使用基本方法已经成功,并且想在此过程中了解更多信息。

一些快速背景: Plotly 使用 'traces' 绘制特定类型的数据(我每个月有 6 条不同的轨迹代表风速箱)。要使下拉菜单起作用,您需要一个布尔值列表来说明可见内容。例如,如果我想要一月份的数据,我需要一个包含 12 个月的 78 个布尔值和年度总数据的列表,其中列表元素 5-11 为真,其余为假。

这是前面提到的基本但有效的代码。

TF = [False]*78
TF[0:5]=[True]*6
Ann_L = TF.copy()

TF = [False]*78
TF[6:11]=[True]*6
Jan_L = TF.copy()

TF = [False]*78
TF[12:17]=[True]*6
Feb_L = TF.copy()

TF = [False]*78
TF[18:23]=[True]*6
Mar_L = TF.copy()

TF = [False]*78
TF[24:29]=[True]*6
Apr_L = TF.copy()

TF = [False]*78
TF[30:35]=[True]*6
May_L = TF.copy()

TF = [False]*78
TF[36:41]=[True]*6
Jun_L = TF.copy()

TF = [False]*78
TF[42:47]=[True]*6
Jul_L = TF.copy()

TF = [False]*78
TF[48:53]=[True]*6
Aug_L = TF.copy()

TF = [False]*78
TF[54:59]=[True]*6
Sep_L = TF.copy()

TF = [False]*78
TF[60:65]=[True]*6
Oct_L = TF.copy()

TF = [False]*78
TF[66:71]=[True]*6
Nov_L = TF.copy()

TF = [False]*78
TF[72:77]=[True]*6
Dec_L = TF.copy()

如您所见,我制作了一个大列表,编辑 6 元素切片,复制到一个新变量并为每个月重新做。我只是想循环这个来清理它。任何帮助将不胜感激。

正在使用的示例变量

fig.update_layout(
updatemenus=[
    dict(
        x=0.1,
        xanchor="left",
        y=0.99,
        yanchor="top",
        active=0,
        showactive= True,
        buttons=list([
            dict(label="Annual",
                 method="update",
                 args=[{"visible": Ann_L},
                       {"title": "Annual"}]),
            dict(label="January",
                 method="update",
                 args=[{"visible": Jan_L},
                       {"title": "January"}]),

列表列表

您可以使用列表理解创建所有列表,然后使用解构将每个列表分配给相关变量。


L = [[False]*(n*6)+[True]*6+[False]*(73-n*6) for n in range(0, 13)]

Ann_L, Jan_L, Feb_L, Mar_L, Apr_L, May_L, Jun_L, Jul_L, Aug_L, Sep_L, Oct_L, Nov_L, Dec_L = L

列表词典

这里有一个替代方案,它使用键 Ann_L, Jan_L, Feb_L etc.

创建字典

要使用它,您需要调整代码以使用 months['Ann_L'] etc.

names = ['Ann_L', 'Jan_L', 'Feb_L', 'Mar_L', 'Apr_L', 'May_L', 'Jun_L', 
         'Jul_L', 'Aug_L', 'Sep_L', 'Oct_L', 'Nov_L', 'Dec_L']

months = {names[n]: [False]*(n*6)+[True]*6+[False]*(73-n*6) for n in range(0, 13)}

您甚至可以像这样动态构建按钮

from calendar import month_name

months = list(month_name)
months[0] = 'Annual'
buttons = [{
    'label': months[i],
    'method': 'update',
    'args': [{'visible': [False]*(i*6)+[True]*6+[False]*(73-i*6)}, {'title': month_name[i]}]
} for i in range(13)]

您不必创建缩写月份名称的变量

编辑:固定'args'为列表