我在下面有一个关注列表。我想将每个项目从列表分别转移到不同的变量,而又不知道其长度
例如,考虑以下列表:
list1 = ['item1', 'item2', 'item3', 'item4']
预期结果是:
var1 = 'item1'
var2 = 'item2'
var3 = 'item3'
var4 = 'item4'
真正的目标是避免“超出范围”错误。因为我不知道列表的长度,所以长度可能会有所不同。
例如,该列表可能是:
list1 = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7']
在这种情况下,预期结果将是:
var1 = 'item1'
var2 = 'item2'
var3 = 'item3'
var4 = 'item4'
var5 = 'item5'
var6 = 'item6'
var7 = 'item7'
让我给您一个真实的案例。我的脚本连接到防火墙并执行以下命令:
nameif = net_connect.send_command(“显示nameif”)
MM1MDA-VRJRAE-SM01/act# show nameif
Interface Name Security
Management0/0 mgmt 99
TenGigabitEthernet1/7 dmzncl 75
Port-channel1.279 dmz3 80
Port-channel1.291 dmz5 50
Port-channel1.293 dmz4 70
Port-channel1.295 dmzvdi 60
Port-channel1.2021 dmzvdi1 60
此命令的输出可能会有所不同,具体取决于设备上有多少个接口。在某些情况下,它可以具有3个接口,4个接口或更多接口...因此,我筛选了一个列表:
nameif_entry = nameif.split()
删除其他无关紧要的信息后
del nameif_entry [0:4]
nameif_edited = nameif_entry [:: 3]
打印(名称已编辑)
['mgmt','dmzncl','dmz3','dmz5','dmz4','dmzvdi','dmzvdi1']
运行以下行并将其发送到许多列表后,如下所示:
int_0 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [0],src_ip))
int_1 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [1],src_ip))
int_2 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [2],src_ip))
int_3 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [3],src_ip))
int_4 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [4],src_ip))
int_5 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [5],src_ip))
int_6 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [6],src_ip))
int_7 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [7],src_ip))
int_8 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [8],src_ip))
int_9 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [9],src_ip))
int_10 = net_connect.send_command(“显示路由%s%s”%(nameif_edited [10],src_ip))
所以这里就是发生问题的地方。我收到以下错误:
int_7 = net_connect.send_command(“显示路由%s%s” %(nameif_edited [7],src_ip))IndexError:列表索引超出范围
答案 0 :(得分:2)
如果您不知道列表有多长时间,您打算如何在源代码中放入足够的变量来保存它们?
通常来说,如果您有列表
list1 = ['item1', 'item2', 'item3', 'item4']
并且您想对每个元素做某事,您可以这样做:
for elem in list1:
print(elem) # this prints each element on a new line
您根本不需要索引 (80%以上的时间)。如果还需要索引,请使用enumerate()
:
for index,elem in enumerate(list1):
print(index, elem)
输出:
0 item1
1 item2
2 item3
3 item4
如果您的元素有上限,并且“无害”默认值可以作弊:
a,b,c,d,e,f,g,h,i,k, *_ = list1 + [""]* 11
在这种情况下,字母将用list1的元素填充,并且任何“不存在”的元素都将使用空字符串之一。 *_
将消耗列表的其余部分。
这仅适用于小范围-f.e.如果您获得3-8个字符串,并且想要为未提供的任何字符串加上“”。如果我需要一次同时而不是一个接一个地使用其中几个字符串,我可能会用到它。
示例:
list1 = ['item1', 'item2', 'item3','item4']
a,b,c,d,e,f,g,h,i,k, *_ = list1 + [""]* 11 # extract into 11 vars
for elem in [a,b,c,d,e,f,g,h,i,k,_]: # stuff all of them back into a list to print
print(elem) # using less code - lists are cool
输出:
item1 # a
item2 # b
item3 # c
item4 # d
# e
# f
# g
# h
# i
# k
['', '', '', '', ''] # _
Doku:
使用列表分解的示例(这是一种更聪明的方法-几乎总有比使用默认值的“作弊”列表分解更好的方法了。)
任务:从用户输入的列表(最多包含1到6个元素)计算f(x) = k_0 + k_1*x +k_2*x**2 + ...
的{{1}}:
x**5
所有这些工作……但这更聪明(也更简洁):
def calc_f(my_coeff, x):
# padd list with enough 0 (neutral in our case) to avoid indexerrors
"""Using decomposition"""
padded_list = my_coeff + [0] * 6
# extract into vars
a,b,c,d,e,f,*_ = padded_list
return a + b*x +c*x**2 + d*x**3 + e*x**4 + f*x**5
def calc_f_loop_1(my_coeff,x):
"""Using simple loop and manual sum"""
s = 0
idx = 0
# basic approach without enumerate
for elem in my_coeff:
s += elem*x**idx
idx+=1
return s
def calc_f_loop_2(my_coeff,x):
"""Using better loop, still manual sum"""
s = 0
for idx, elem in enumerate(my_coeff):
s += elem*x**idx
idx+=1
return s
测试:
calc_f_smarter = lambda l,x: sum( pl*x**idx for idx,pl in enumerate(l) )
输出:
list1 = [5, 3, 3, 4] # variable input - max. 6 numbers
for method, f in (
("calc_f",calc_f),
("calc_f_loop_1",calc_f_loop_1),
("calc_f_loop_2",calc_f_loop_2),
("calc_f_smarter",calc_f_smarter)):
print(f"{method:<15}:", [f(list1,x) for x in range(-5,5)])