I am writing a function for implementing breadth-first search over a no. of nodes in a directed graph. The nodes are all numbers from 1-100. This is my implementation:
def BFS(start= 1, adj_dict= None):
level= {}
current= [start]
visible= []
lno= 0
step= 0
for ele in current:
if ele not in level:
level[ele]= lno
visible.extend(adj_dict[ele])
current.remove(ele)
if current==[]:
current= visible[:]
visible= []
lno+=1
return level
This did not work correctly and stored only the start
key in adj_dict
. I ran the debugger and saw that the code exited for loop after first iteration.
Upon searching a little about the cause of this, I found this question- https://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating on SO. This was the cause of error. The answers to that question suggest that I create a new list somehow, either using list comprehension or using slicing but none of them will help in my case.
So, I thought of addingnesting the for loop inside a while loop to achieve the desired result. This is how it looks now:
while current:
for ele in current:
if ele not in level:
level[ele]= lno
visible.extend(adj_dict[ele])
current.remove(ele)
if current==[]:
current= visible[:]
visible= []
lno+=1
This works now. What I want to ask is this a correct way to achieve the effect or am I just getting lucky and the code can break easily? Also is this the pythonic way?