Python 循环以更改大列表中的元素(一次6个),并为每次迭代创建一个新变量
我正在使用plotly制作一个风玫瑰,它使用下拉菜单来绘制每个月。我想使用循环稍微清理一下我的代码,但是我已经用一种基本的方法成功了,并且希望在这个过程中了解更多 一些快速的背景: Plotly使用“迹线”绘制特定类型的数据(我每月有6条不同的迹线表示风速箱)。要使下拉菜单工作,您需要一个布尔列表,说明哪些是可见的。例如,如果我想要1月份的数据,我需要一个12个月内78个布尔值的列表和年度总数据,列表元素5-11为真,其余为假 下面是前面提到的基本代码,尽管它是工作代码Python 循环以更改大列表中的元素(一次6个),并为每次迭代创建一个新变量,python,list,loops,plotly,slice,Python,List,Loops,Plotly,Slice,我正在使用plotly制作一个风玫瑰,它使用下拉菜单来绘制每个月。我想使用循环稍微清理一下我的代码,但是我已经用一种基本的方法成功了,并且希望在这个过程中了解更多 一些快速的背景: Plotly使用“迹线”绘制特定类型的数据(我每月有6条不同的迹线表示风速箱)。要使下拉菜单工作,您需要一个布尔列表,说明哪些是可见的。例如,如果我想要1月份的数据,我需要一个12个月内78个布尔值的列表和年度总数据,列表元素5-11为真,其余为假 下面是前面提到的基本代码,尽管它是工作代码 TF = [False]
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)表示范围(0,13)内的n)
安、一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月=L
列表词典
这里有一个替代方法,它可以创建一个带有键的字典Ann\u L、Jan\u L、Feb\u L等。
要使用此功能,您需要调整代码以使用months['Ann_L']等。
names=['Ann_L'、'Jan_L'、'Feb_L'、'Mar_L'、'Apr_L'、'May_L'、'Jun_L',
‘七月’、‘八月’、‘九月’、‘十月’、‘十一月’、‘十二月’]
月份={names[n]:[False]*(n*6)+[True]*6+[False]*(73-n*6)表示范围(0,13)内的n}
您甚至可以像这样动态构建按钮
从日历导入月份\u名称
月份=列表(月份名称)
月[0]=“年度”
按钮=[{
“标签”:月[i],
'方法':'更新',
'args':[{'visible':[False]*(i*6)+[True]*6+[False]*(73-i*6)},{'title':月名[i]}
}适用于范围(13)]
您不必创建缩写月份名称的变量
编辑:将“args”固定为列表您如何使用变量Jan_L等。提供一个包含这些变量以及如何绘制它们的最小可复制示例。这将有助于重构/使用字典映射在我使用变量的代码中编辑的跟踪等。它所代表的只是一长串的布尔,这很好。事实上,我想说的是(答案几乎相同),OP应该只将月份保存在一个列表中,而不是分配单独的变量,这几乎总是更难处理。可以把它叫做
Months
。哇,这太棒了,它工作得很好,正是我想要的。谢谢你这是一个非常优雅的解决方案,只有一个列表。我打算建议使用itertools,这肯定有点笨手笨脚。除了是一个成功的解决方案之外,我还想弄清楚到底发生了什么,但确实非常优雅。