Переполнение списка

Необходимо выполнить парсинг xml-файла и вывести отсортированную информацию на экран (по возрастанию лет ( года находятся в child )).

У меня выводит следующую ошибку:

Traceback (most recent call last): line 14, in <module>
    copy1[i] = int(child.text)
IndexError: list assignment index out of range

Подскажите пожалуйста, в чем проблема

import xml.etree.ElementTree as ET
tree = ET.parse('catalog.xml')
grandpa = tree.getroot()
start = int(input())
end = int(input())
copy1 = []
copy2 = []
copy3 = []
i = 0

for daddy in grandpa:
    for child in daddy.findall('YEAR'):
        if int(child.text) in range(start, end+1):
            copy1[i] = int(child.text)
            #dct[int(child.text)] = (daddy.attrib['artist'],  daddy.attrib['title'])
            copy2[i] = daddy.attrib['artist']
            copy3[i] = daddy.attrib[title]
            i+=1

if i == 0:
    print('Ничего не найдено')
else:
    print(f'За период {start} - {end} было выпущено: {i} альбома(ов)')
    for i in range(start, end+1):
        print(f'{copy1[i]}: {copy2[i]} - "{copy3[i]}"')

Ответы (1 шт):

Автор решения: insolor

У вас списки изначально пустые. Список не увеличивается автоматически при попытке обращения по индексу, выходящему за границы списка.

Для любого списка допустимо обратиться по индексу, который больше или равен 0 и меньше длины списка (0 <= i < len(s)). Если список изначально пустой (длина равна нулю), то условие превращается в 0 <= i < 0 - такое условие не выполняется ни для какого значения i.

Нужно добавлять значения в список с помощью метода append:

copy1 = []
copy2 = []
copy3 = []

for daddy in grandpa:
    for child in daddy.findall('YEAR'):
        if int(child.text) in range(start, end+1):
            copy1.append(int(child.text))
            #dct[int(child.text)] = (daddy.attrib['artist'],  daddy.attrib['title'])
            copy2.append(daddy.attrib['artist'])
            copy3.append(daddy.attrib['title'])

if len(copy1) == 0:
    print('Ничего не найдено')
else:
    print(f'За период {start} - {end} было выпущено: {len(copy1)} альбома(ов)')

    for i in range(len(copy1)):
        print(f'{copy1[i]}: {copy2[i]} - "{copy3[i]}"')

Индексы в полученных списках не будут совпадать с диапазоном от start до end, поэтому в последнем цикле нужно проходить от 0 до конца полученного списка, а в диапазоне от start до end.

→ Ссылка