Создать новые переменные по списку длины - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть список ниже.Я хотел бы перенести каждый элемент из списка в разные переменные по отдельности, не зная его длины

Например, рассмотрим следующий список:

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 ("show 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]

print(nameif_edited)

['mgmt', 'dmzncl', 'dmz3', 'dmz5', 'dmz4', 'dmzvdi', 'dmzvdi1']

После запускаследующие строки и отправить во многие списки, как показано ниже:

int_0 = net_connect.send_command ("show route% 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 ("show route% s% s"% (nameif_edited [10], src_ip))

Так что именно здесь возникает проблема.Я получаю следующую ошибку:

int_7 = net_connect.send_command ("show route% s% s"% (nameif_edited [7], src_ip)) IndexError: список индексов вне диапазона

1 Ответ

0 голосов
/ 15 декабря 2018

Если вы не знаете, какой длины список заранее, как вы планируете поместить в исходный код достаточное количество переменных для их хранения?

Вообще говоря, если у вас есть список

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, а любой элемент «non-present» займет одну из пустых строк.*_ будет использовать оставшуюся часть списка.

Это работает только для небольших диапазонов - например, если вы получаете 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
['', '', '', '', '']  # _

Доку:


Пример использования декомпозиции списка (и более разумный способ сделать это - почти всегда есть лучший способ, чем прибегнуть к "обманчивому" декомпозиции списка со значениями по умолчанию).

Задача: вычислить f(x) = k_0 + k_1*x +k_2*x**2 + ... для до x**5 из введенного пользователем списка, который содержит от 1 до 6 элементов:

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

Выходы:

calc_f         : [-435, -215, -85, -21, 1, 5, 15, 55, 149, 321]
calc_f_loop_1  : [-435, -215, -85, -21, 1, 5, 15, 55, 149, 321]
calc_f_loop_2  : [-435, -215, -85, -21, 1, 5, 15, 55, 149, 321]
calc_f_smarter : [-435, -215, -85, -21, 1, 5, 15, 55, 149, 321]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...