Индекс списка находится вне диапазона - но я проверяю длину перед обработкой - PullRequest
0 голосов
/ 20 октября 2018

Интересно, можете ли вы посоветовать - я получаю приведенную ниже ошибку при обработке списка предметов.Я должен отметить, что этот скрипт работает для 99% элементов - поскольку я расширил список до 84 миллионов строк, я теперь получаю эту проблему.

Я делаю это для каждой строки

elif len(str(x)) > 3 and str(x[len(x)-2]).rstrip() in cdns:

Итак, я не вижу, как индекс может выходить за пределы диапазона, если я активно проверяю, превышает ли он определенную длину перед обработкой?

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-a28be4b396bd> in <module>()
     21     elif len(str(x)) > 4 and str(x[len(x)-2]).rstrip() in cdns:
     22       cleandomain.append(str(x[len(x)-3])+'.'+str(x[len(x)-2])+'.'+str(x[len(x)-1]))
---> 23     elif len(str(x)) > 5 and str(x[len(x)-3]).rstrip() in cdns:
     24       cleandomain.append(str(x[len(x)-4])+'.'+str(x[len(x)-3])+'.'+str(x[len(x)-2])+'.'+ str(x[len(x)-1]))
     25     #if its in the TLD list, do this

IndexError: list index out of range

Полный цикл ниже,так что я ожидал бы, что если бы элемент списка индекса был вне диапазона, он просто выполнил бы другую команду и напечатал бы значение списка?

  for x in index:
    #if it ends with a number, it's an IP
    if str(x)[-1].isnumeric():
      cleandomain.append(str(x[0])+'.'+str(x[1])+'.*.*')
    #if its in the CDN list, take a subdomain as well
    elif len(str(x)) > 3 and str(x[len(x)-2]).rstrip() in cdns:
      cleandomain.append(str(x[len(x)-3])+'.'+str(x[len(x)-2])+'.'+str(x[len(x)-1]))
    elif len(str(x)) > 4 and str(x[len(x)-3]).rstrip() in cdns:
      cleandomain.append(str(x[len(x)-4])+'.'+str(x[len(x)-3])+'.'+str(x[len(x)-2])+'.'+ str(x[len(x)-1]))
    #if its in the TLD list, do this
    elif len(str(x)) > 3 and str(x[len(x)-2]).rstrip()+'.'+ str(x[len(x)-1]).rstrip() in tld:
      cleandomain.append(str(x[len(x)-3])+'.'+str(x[len(x)-2])+'.'+ str(x[len(x)-1]))
    elif len(str(x)) > 2 and str(x[len(x)-1]) in tld:
      cleandomain.append(str(x[len(x)-2])+'.'+ str(x[len(x)-1]))
    #if its not in the TLD list, do this
    else:
      cleandomain.append(x)

X генерируется как показано ниже:

X - это список списков - разделенные части домена, как показано ниже [['' news ',' bbc ',' co ',' uk '], [' graph ',' facebook ',' com ']]

import pandas as pd
path = "Desktop/domx.csv"
df = pd.read_csv(path, delimiter=',', header='infer', encoding = "ISO-8859-1")
df2 = df[((df['domain'] != '----'))]
df3 = df2[['domain', 'use']]
for row in df2.iterrows():
  index = df3.domain.str.split('.').tolist()

Любая помощь будет отличной

1 Ответ

0 голосов
/ 20 октября 2018

Позвольте мне подробнее остановиться на том, что сказал Корентин Лимьер в комментариях с конкретным контрпримером, поскольку вы категорически отрицаете, что это может быть правдой, без фактической проверки вашего отладчика:

на основе исходного дампа ошибок вопроса:

---> 23 elif len (str (x))> 5 и str (x [len (x) -3]). Rstrip () в cdns:
IndexError: перечислить индекс издиапазон

x = ['counterexample']
print ('x =', x)
print ('length of x is', len(x))
print ('length of str(x) is', len(str(x)))

if len(str(x)) > 5:
    print ('You think this is safe')

try:
    x[len(x)-3]
except IndexError:
    print ('but it is not.')

x = ['контрпример']
длина x равна 1
длина str (x) равна 18
Вы считаете, что это безопасно
но это не так.

Вам необходимо знать, является ли индекс действительным, по сравнению с количеством элементов в x.Вы на самом деле смотрите на длину строкового представления x, которое совершенно другое.Строка длиной 18 символов, но в списке есть только один элемент.

PS: Не расстраивайтесь, мы ВСЕ сделали это.Под этим я подразумеваю «получить шоры, когда мы написали код, совершенно отличный от того, что мы думали».Это одна из основных причин «проверки кода» в профессиональных настройках.

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