Ошибка индекса Python в цикле, когда индекс находится в цикле for - PullRequest
0 голосов
/ 09 апреля 2019

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

list index out of range

Я понимаю, что означает эта ошибка, но я не могу понять, почему. Мой код следующий:

def check_cat(input, list_of_words, categories):
"""if a word is not in the possible set of words of a class, cannot be in this class"""
possible_cat = list_of_words
categories_copy = categories
for j in range(len(list_of_words)):
    for i in input:
        if i not in list_of_words[j][:,1]:
            possible_cat.pop(j)
            categories_copy = np.delete(categories_copy,j)
        else:
            pass

, где categories = array(['culture', 'politics', 'sports'], dtype='|S8') и

list_of_words =    
[array([['0.14285714285714285', 'ball'],
            ['0.2857142857142857', 'cart'],
            ['0.14285714285714285', 'drama'],
            ['0.14285714285714285', 'opera'],
            ['0.2857142857142857', 'theater']], dtype='|S32'),
     array([['0.25', 'decision'],
            ['0.5', 'drama'],
            ['0.25', 'strategy']], dtype='|S32'),
     array([['0.2857142857142857', 'ball'],
            ['0.14285714285714285', 'cart'],
            ['0.2857142857142857', 'goal'],
            ['0.14285714285714285', 'player'],
            ['0.14285714285714285', 'strategy']], dtype='|S32')]

Я действительно не понимаю, что когда я выполняю код «вне» функции / без функции, она работает. Но через функцию я получаю ошибку:

    File "<ipython-input-110-b499e8f5d937>", line 7, in check_cat
    if i not in list_of_words[j][:,1]:
IndexError: list index out of range

Мне кажется, что индекс j находится в диапазоне list_of_words, потому что я зацикливаюсь внутри него ... Любая помощь будет чрезвычайно признательна.

1 Ответ

1 голос
/ 09 апреля 2019

Я думаю, что источник вашей ошибки лежит в присваивании переменной. Когда вы присваивали две переменные внутри функции, вы на самом деле не создаете копию, а скорее создаете ссылку на исходный объект Python. Поэтому, когда вы делаете pop, это фактически уменьшает длину исходного, пока len читается первым, поэтому цикл выполняется больше раз, чем количество элементов.

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

Что касается вашего вопроса, я перестал получать ошибку с небольшим изменением, где я скопировал входные данные, а не создал ссылку на него с помощью .copy().

possible_cat = list_of_words.copy()
categories_copy = categories.copy()

Надеюсь, это прояснит ситуацию и именно то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...