When dealing with similar situations, I put the block in a separate function, and use return result instead of break. The overhead of a single function call is negligible and readability is usually greatly improved.
This is great advice, and I’d like to specifically emphasize the readability factor. When your code becomes nested to the degree of the above, it’s a very strong indication that it should be refactored into separate functions/methods.
That’s a significant part of why Python does not define a keyword or some form of “labeled loops” to break or continue to a specific level. Typically, it’s only a real issue in overly nested code that ought to be refactored anyways.