Search code examples
pythonlistdictionarybreakcsvreader

break inner loops and pass control to outermost loop in python


Here is what I am looping through complex nested dictionaries inside a list called adm2_geonames. I then have a csv file whose line[1] needs to searched inside adm2_geonames. Once found, I want to break the loops for adm2_geonames i.e. starting from for dic in adm2_geonames: and pass the control to for line in csvReader: for next keyword, until all in the csv are read. I am confused about setting the scope for break statement. I have tried putting multiple break statements also for each inner loop. Seems, not the right approach. Please I am a beginner python learner, so please be patient if my question is naïve.

coords = []
with open('ADM2_hits.csv') as csvFile:
    csvReader = csv.reader(csvFile)
    next(csvReader)
    for line in csvReader:
        keyword = line[1]
        for dic in adm2_geonames:
            for key in dic:
                if(key == "geonames"):
                    for x in dic[key]:
                        if(keyword == x['name']):
                            line.append(x['lat'])
                            line.append(x['lng'])
                            coords.append(line)
                            break
print(coords)

Solution

  • One approach is to use an else: block to capture the case in which the inner loop was not broken (in which case you want to continue), followed by a break to break the outer loop if the else hasn't already continued it:

    coords = []
    with open('ADM2_hits.csv') as csvFile:
        csvReader = csv.reader(csvFile)
        next(csvReader)
        for line in csvReader:
            keyword = line[1]
            for dic in adm2_geonames:
                for x in dic["geonames"]:
                    if(keyword == x['name']):
                        line.append(x['lat'])
                        line.append(x['lng'])
                        coords.append(line)
                        break
                else:
                    continue
                break
    print(coords)
    

    Note that you can eliminate some of that inner looping by just going straight to dic["geonames"] instead of looping over the entire dictionary; the whole point of dictionaries is that you can jump straight to a given entry by its key instead of having to search the whole thing iteratively.