Переполнение списка
Необходимо выполнить парсинг 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 шт):
У вас списки изначально пустые. Список не увеличивается автоматически при попытке обращения по индексу, выходящему за границы списка.
Для любого списка допустимо обратиться по индексу, который больше или равен 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.