2013-11-02 4 views
2

У меня есть следующий список:Операции со списками

Words = ['This','is','a','list','and','NM,'] 

Примечание: Слова [5] >>> Н.М., (с запятой (,))

New_List = [] 
for word in Words: 
    if word[:2] =="NM": 
     Words.insert((Words.index("NM")),input("Input a " + ac_to_word("NM") + ": ")) 
     Words.remove("NM") 

Всякий раз, когда я пытаюсь запустить это, я получаю:

Words.insert((Words.index("NM")),input("Input a " + ac_to_word("NM") + ": ")) 
ValueError: 'NM' is not in list 

Но «NM» - это индекс 5. Что здесь происходит? Я прошу слово [: 2] не все слово.

Я попытался выяснить проблему, но никто не был вокруг, чтобы посмотреть на мой код и дать мне обратную связь, поэтому, хотя, возможно, некоторые люди там могут помочь. Если вы видите ошибку, пожалуйста, покажите мне, где. Любая помощь приветствуется!

+1

Не сообщение об ошибке совершенно ясно? Вы пытаетесь получить индекс строки '' NM'' из списка 'Words', но его там нет. '' NM '! =' NM, ''. –

+0

Ну, «NM» нет в списке, чего вы ожидаете? – sashkello

+0

Не изменяйте список во время итерации по нему –

ответ

2

Несколько проблем:

  1. Вы пытаетесь получить доступ к строке 'NM' в списке, который не имеет такой пункт.
  2. Вы изменяете список по мере его повторения по нему. Не делай этого! Это будет иметь неожиданные последствия.

Простой способ здесь, вероятно, будет перебирать список индексов вместо пунктов:

Words = ['This','is','a','list','and','NM,'] 
for i in xrange(len(Words)): 
    if Words[i].startswith('NM'): 
     Words[i] = input("Input a " + ac_to_word("NM") + ": ") 

Обратите внимание, что я просто замена на NM... элементы с результатом input(). Это более эффективно, чем вставка и удаление элементов.

2

ошибка происходит из здесь:

Words.index("NM") 

'NM' не in ваш список строк.

Выполнение вставки и удаления операций в последовательности, когда вы выполняете итерацию по ней, является плохой, плохой идеей. Это верный способ пропустить элемент или удвоить действие элемента. Кроме того, вы не должны выполнять линейный поиск с index, так как a) он медленный и b) что произойдет, если у вас есть дубликаты?

Просто используйте enumerate:

for i,word in enumerate(words): 
    if word[:2] == 'NM': 
     words[i] = input('replace NM with something: ') 
+0

Почему так много голосов? –

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