根据长度列表创建新变量

时间:2018-12-14 22:41:01

标签: python python-3.x list

我在下面有一个关注列表。我想将每个项目从列表分别转移到不同的变量,而又不知道其长度

例如,考虑以下列表:

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:列表索引超出范围

1 个答案:

答案 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)])