Home > Back-end >  while loop with dynamic list in python using a dictionnary
while loop with dynamic list in python using a dictionnary

Time:03-12

I have a dictionary with lots of data from a CSV file where the key is the row number and the value is a list that contains the column data.

What I want to do is to check from a data of each line (key) and from column 2, I take its data from column 4 and then look for this data in column 2 of another line (key) and take its data in column 4 and continue until it finds the last value of column 4 in column 2.

My code is this:

dict_FH_coord = self.dict_FH() 
site_SI='some_site'       
list_test = [site_SI]

while len(list_test) > 0:
    for ele in list_test:
        for cle, val in dict_FH_coord.items():
            list_test = []
            if val[2] == ele:
                list_test.append(val[4])
                list_def.append(val)
                print(val)

But this code does not work because it stops at the first iteration and it finds that the elements linked to the starting site_SI only

Is there a way to do successive iterations with the list list_test which becomes dynamic to solve my problem?

CodePudding user response:

Can you provide an example of what you are trying to achieve?

CodePudding user response:

If you want to modify list 'on air' you sohuld do something like

a = [1, 2, 3]
a[:] = [1, 2]

In your case the only way you may use this inside the loop (avoiding infinite list size increasement):

if val[2] == ele:
    list_test[:] = list_test[1:] [val[4]]
    list_def.append(val)
else:
    list_test[:] = list_test[1:]

But it wont work as intended because previous iteration ends at index 1 (for ele in list_test:), and list_test would never change in size.

Both this cases can not be merged with each other.

I suggest you to use Queue, but be careful to avoid infinite links looping inside your data:

from queue import Queue
dict_FH_coord = {
    1: [0, 1, 'some_site', 3, 'some_site_2'],
    2: [0, 1, 'some_site_2', 3, 'some_site_3'],
    3: [0, 1, 'some_site_2', 3, 'some_site_4'],
    4: [0, 1, 'some_site_3', 3, 'some_site_5'],
}
site_SI = 'some_site'
unvisited = Queue()
unvisited.put(site_SI)
list_def = list()
while not unvisited.empty():
    ele = unvisited.get()
    for cle, val in dict_FH_coord.items():
        if val[2] == ele:
            unvisited.put(val[4])
            list_def.append(val)
            print(val)
  • Related