循环更改大列表中的元素(一次 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'为列表
我正在使用 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'为列表