2016-09-26 2 views
0

Я занимаюсь книжным упражнением по функции pop() в Python (3.5). Инструкции состоят в том, чтобы удалить элементы из списка, используя pop(). Из приведенного ниже списка я хочу удалить n1, n4, n5, n6, n7, n8, n9. Ниже код работает, но очень практичен), и я не понимаю, почему конкретный индекс работает только до [5]. Без использования циклов (я еще не там), каков правильный способ ввода определенных элементов из списка?Удаление (POPing) определенных элементов из списка

nameList = ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9'] 
print('I can only invite two people to dinner...') 

print('Sorry, but ', nameList.pop(0).title(), ' will not be invited to 
     dinner') 
print('Sorry, but ', nameList.pop(3).title(), ' will not be invited to 
     dinner') 
print('Sorry, but ', nameList.pop(4).title(), ' will not be invited to 
     dinner') 
print('Sorry, but ', nameList.pop(5).title(), ' will not be invited to 
     dinner') 
print('Sorry, but ', nameList.pop(-1).title(), ' will not be invited to 
     dinner') 
print('Sorry, but ', nameList.pop(-1).title(), ' will not be invited to 
     dinner') 
print('Sorry, but ', nameList.pop(-1).title(), ' will not be invited to 
     dinner') 

ответ

2

Выход:

I can only invite two people to dinner... 
('Sorry, but ', 'N1', ' will not be invited todinner') 
('Sorry, but ', 'N5', ' will not be invited to dinner') 
('Sorry, but ', 'N7', ' will not be invited to dinner') 
('Sorry, but ', 'N9', ' will not be invited to dinner') 
('Sorry, but ', 'N8', ' will not be invited to dinner') 
('Sorry, but ', 'N6', ' will not be invited to dinner') 
('Sorry, but ', 'N4', ' will not be invited to dinner') 

Позволяет увидеть:

В первом списке имеет 9 элементов. Вы удалите первый с pop(0) так что теперь у вас есть список из 8 элементов, а именно:

['n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9'] 

Не удалить 3-е elelemnt из этого «нового» списка, который n5 (помните, индексация начинается с 0)

И так далее ...

После каждого удаления список будет просто короче, поэтому даже после первого удаления там будет элемент в восьмой позиции для удаления (это происходит после pop (5) в вашем случае) ,

Нет общего способа удаления элементов из списка, но обратите внимание, что списки являются изменяемыми переменными.

1

Ну, длина имени списка изменяется динамически каждый раз, когда вы используете «поп». Итак, после того, как вы поп 4 элемента (n1, n4, n5, n6), осталось только 5 элементов в списке nameList. Вы не можете использовать pop (5) больше, потому что в это время индекс выходит за пределы диапазона.

0

Специфический индекс работает как шарм для всех индексов до размера вашего списка. Проблема, с которой вы сталкиваетесь, заключается в том, что когда вы удаляете элемент из списка, вы сокращаете его, размер уменьшается на 1 каждый раз, когда вы поп.

Скажем, у вас есть список из 3-х элементов, l = ["a","b","c"] Вы суете первый один l.pop(0), который будет возвращать "a", но он также будет вносить изменения в список, так что теперь l равно ["b","c"]. Если вместо этого вы вытащили последний элемент с l.pop(2) или l.pop(-1) (потому что Python также позволяет вам подсчитывать элементы из последнего, так что -1 всегда является последним элементом списка), вы получили бы "c" и список l стал бы ["a","b"]. Обратите внимание, что в обоих случаях список сократился и осталось только два элемента, поэтому теперь вы не сможете поместить номер элемента 2, поскольку такой вещи нет.

Если вы хотите прочитать элемент вместо его удаления из списка, используйте синтаксис myList[elementIndex]. Например, в вашем примере nameList[6] вернет "n7", но он не будет изменять список вообще.

0

Это происходит потому, что длина вашего списка изменяется каждый раз, когда вы вытаскиваете элемент из списка.Так что если вы хотите использовать pop специально, чтобы удалить указанные элементы легко и сложным способом было бы следующее:

>>> nameList = ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9'] 
>>> 
>>> nameList.pop(nameList.index('n1')) 
'n1' 
>>> nameList.pop(nameList.index('n4')) 
'n4' 
>>> nameList.pop(nameList.index('n5')) 
'n5' 
>>> nameList.pop(nameList.index('n6')) 
'n6' 
>>> nameList.pop(nameList.index('n7')) 
'n7' 
>>> nameList.pop(nameList.index('n8')) 
'n8' 
>>> nameList.pop(nameList.index('n9')) 
'n9' 
>>> nameList 
['n2', 'n3'] 

Так как вы можете видеть каждый раз, когда мы выскочить элемент мы указываем его index поэтому мы не» t возникает проблема, связанная с изменением длины списка - по причине использования index мы получим новый индекс элемента! И, как вы можете видеть, результат будет: ['n2', 'n3'] как и ожидалось!

Смежные вопросы