Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2019, 23:11   #1
Константин01
Пользователь
 
Регистрация: 11.05.2019
Сообщений: 21
По умолчанию Ошибка при итерации

Доброе время суток!

Есть класс дерева, который содержит массив с узлами.

Код:
class Tree:
	def __init__(self, grammar):
		self.grammar = grammar;
		self.root = None;
		self.nodes = list();
Функция "reduce" проходит по данному массиву и ищет пары узлов, которую может свести (редуцировать) к одной (по определенным правилам грамматики). Если есть такая пара, то эта пара из массива удаляется (array.remove()), на место первой вставляется одна новая (array.insert()). Естественно, что длина массива (len(array)) уменьшится на единицу.

Код:
def reduce(self):
		for i in range(len(self.nodes)):
			for j in range(len(self.nodes)):
					rule = str(self.nodes[i].tag) + ' ' + str(self.nodes[j].tag);
					if (rule in self.grammar.keys()):
						self.unite_nodes(self.nodes[i], self.nodes[j], self.grammar[rule])
						self.reduce()
Если редукция произошла, то происходит рекурсивный вызов, снова проходит итерация по парам.

Проблема: возникает ошибка, которая сигнализирует о том, что переменные циклы i или j вышли за пределы индексов массива.

Почему так происходит? Информация о длине массива (len(array)) не обновляется после рекусирсивного вызова?
Константин01 вне форума Ответить с цитированием
Старый 27.07.2019, 04:27   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Константин01 Посмотреть сообщение
Информация о длине массива (len(array)) не обновляется после рекусирсивного вызова?
Информация о длине обновляется при каждом вызове len, но в заголовках цикла используется range, и она вычисляется только один раз, при входе
Black Fregat вне форума Ответить с цитированием
Старый 27.07.2019, 13:13   #3
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
По умолчанию

Используй, будет идти по копии списка. и спокойно без проблем удалять информацию из основного
Код:
for i, item in enumerate(self.nodes.copy()):
zdus2757 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при итерации по XML freez89 C# (си шарп) 1 04.10.2017 20:39
"Решение системы линейных алгебраических уравнений методом простой итерации" и "Решение нелинейного уравнения методом итерации" BORODA77 Помощь студентам 0 19.03.2014 17:31
Метод простой итерации, ошибка при реализации ИВэТэшка Паскаль, Turbo Pascal, PascalABC.NET 4 05.10.2012 18:05
ошибка #ДЕЛ/0! при итерации usa10co Microsoft Office Excel 8 03.02.2010 16:26
Метод простых итерации для нелинейных уравнений. Подскажите где ошибка DuHbka Помощь студентам 15 31.05.2009 22:46