По какой-то причине я продолжаю получать ошибку индекса, даже когда элемент находится в диапазоне - PullRequest
1 голос
/ 07 ноября 2019

Я продолжаю получать ошибку индекса вне диапазона для этого кода? Хотя здесь явно три пункта. Это работает, когда я помещаю 0 и -1, но не когда я помещаю 1 в split_age [1]. Я что-то пропустил?

ages = []
for d in open_files:
    if len(d) >= 3:
        age = d[3]
        split_age = age.split(','[0:])
        ages.append(split_age[1])
print(ages)

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Есть две вещи, о которых вы не спрашивали, но могли всплыть позже:

  1. , если len(d) == 3, тогда d[3] попытается получить доступ к элементу вне d, а именно его 4-й элемент и IndexError будут выброшены. Если вы хотите получить доступ к последнему элементу, то d[-1] - это то, что вы ищете. В противном случае просто измените условие на if len(d) > 3.

  2. ','[0:] в age.split(','[0:]) является избыточным, поскольку ','[0:] == ','.

Чтобы понять, почему вы получаете сообщение об ошибке при использовании split_age[1], рассмотрим, что происходит, когда в age нет ','. Например, скажем age == "12.12", тогда age.split(',') вернет ["12.12"] - массив только с одним элементом. Таким образом, попытка получить доступ к элементу 2nd с индексом 1 выдает IndexError. Наконец, если age - пустая строка, то же самое произойдет, age.split(',') вернет массив с одним элементом [''], и попытка доступа к его второму элементу не удастся. Таким образом, вы можете быть уверены, что, пока age является строкой, split(',') будет возвращать массив хотя бы с одним элементом (в противном случае он, скорее всего, все равно выдаст ошибку).

Решением для этого является либо явная проверка длины split_age, либо наличие разделителя, используемого в split (в вашем случае ",") в age. Также обратите внимание, что второй будет работать, даже если age == ',', как в этом случае age.split(','), вернет массив с двумя элементами (а именно, две пустые строки). Учитывая все это, ваш улучшенный код может выглядеть примерно так:

ages = []
for d in open_files:
    if len(d) > 3:
        age = d[3]
        if ',' in age:
            split_age = age.split(',')
            ages.append(split_age[1])
print(ages)
0 голосов
/ 07 ноября 2019

Python использует индекс 0, это означает, что когда ваш список или кортеж имеют 3 элемента, индексы равны 0, 1, 2, то же самое, когда длина вашего списка равна 10, максимальный индекс равен 9, поэтому d (3) выводится из-за ошибки диапазона, поскольку списоку меня нет 4 пункта, я надеюсь, вы понимаете мой ответ

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