Аргумент типа «int» не может быть повторен в python. пожалуйста, объясните

#python #graph

Вопрос:

у меня есть список смежности, и я попытался выполнить итерацию по словарю, передав ключ в качестве параметра в словарь, а затем пытаясь выяснить, присутствовал ли определенный элемент в словаре(список смежности). Но этот код показывает ошибки. кто-нибудь может сказать мне, как это исправить? Код:

 count = 0 def BackAndForth(AList,end1,end2):  global count  if(end2 in AList[end1]):  count =1  for i in AList[end1]:  if(i!=end2):  BackAndForth(AList[i],i,end2)   return count    Alist = {  0 :[2, 3, 6],  1 :[3, 5 ,6] ,  2 :[ 0 ,3 ,4],  3 :[ 0 ,1 ,2, 4],  4 : [2 ,3 ,5],  5 :[ 1 ,4 ,6],  6 :[ 0 ,1 ,5], } end1=0 end2=0 print(BackAndForth(Alist,end1,end2))  

Выход: введите описание изображения здесь

Комментарии:

1. Вы пытаетесь выполнить итерацию по чему-то целочисленному, но вам нужна возможность повторения (список, кортеж и т.д.). Этот ответ одновременно и правильный, и бесполезный. Вы должны спросить себя, почему у вас в этом месте целое число, а не повторяющееся, или, если целое число указано правильно, почему вы пытаетесь повторить его!

Ответ №1:

Ваша функция отлично работает при первом запуске, но обратите внимание, как вы рекурсивно переходите AList[I] к BackAndForth . В этот момент у вас есть массив, что звучит здорово, но у вас также есть это в вашем коде end2 in AList[end1]) , который даст вам int, а не список, который вы ожидали, как только он будет вызван рекурсивно. Ладно, ты решаешь просто передать Алисту. Теперь у вас другая проблема, она повторяется бесконечно. Так что теперь вы должны сказать ему остановиться, когда он найдет совпадение. Попробуйте следующее, это должно работать так, как вы ожидаете:

 count = 0 def BackAndForth(AList,end1,end2):  global count  if(end2 in AList[end1]):  count =1  return count  for i in AList[end1]:  if(i!=end2):  BackAndForth(AList,i,end2)    return count  Alist = {  0 :[2, 3, 6],  1 :[3, 5 ,6] ,  2 :[ 0 ,3 ,4],  3 :[ 0 ,1 ,2, 4],  4 : [2 ,3 ,5],  5 :[ 1 ,4 ,6],  6 :[ 0 ,1 ,5], } end1=0 end2=0 print(BackAndForth(Alist,end1,end2))  

Ответ №2:

Спасибо, чувак, за твое объяснение. Как сказал u, функция рекурсирует бесконечно. После этого я попытался исправить это, добавив посещенный словарь, в котором узлы в качестве ключей и значений являются либо истинными, либо ложными в зависимости от статуса, посещен он или нет. Я даже добавил условие в инструкцию if(чтобы проверить, не посещен ли узел, а затем продолжить). Но, тем не менее, это повторяется бесконечно.Есть какие-нибудь советы, как это остановить?

 count = 0 def BackAndForth(AList,end1,end2):  global count  visited={}  for i in AList.keys():  visited[i] = False  print(AList[end1])  visited[end1] = True  if(end2 in AList[end1]):  count =1  for i in AList[end1]:  if(i!=end2 and not visited[i]):  visited[i] = True  BackAndForth(AList,i,end2)      return count