Contour from triangulation in Python
The cascaded_union function can take more than one object, so you should be able to do:

from shapely.geometry import Polygon, MultiPolygon
from shapely.ops import cascaded_union

def get_region(vertices, triangles):
    regions = MultiPolygon([Polygon([vertices[i] for i in triangle])
                            for triangle in triangles])
    return list(cascaded_union(regions).exterior.coords)


When deleting triangle[72] from your example, which is not really a triangle and the reason for your try...except ValueError, this gives the same area for this function and yours, 1060307.0.

If you cannot delete those zero-size triangles manually, you can do it programmatically as well:

def get_region(vertices, triangles):
    polygons = (Polygon([vertices[i] for i in triangle])
                for triangle in triangles)
    regions = MultiPolygon([p for p in polygons if p.area &gt; 0])
    return list(cascaded_union(regions).exterior.coords)


I would leave getting the points of the exterior to the caller, or another function, but I left it here in order to not change the interface.

Note that cascaded_union may be superseded by unary_union, depending on the version you are using.

I am not sure why you use the datastructure you have. It would be easier to directly store the vertices for each triangle as a three-tuple, so that you could just do:

def get_region(triangles):
    polygons = (Polygon(triangle) for triangle in triangles)
    regions = MultiPolygon([p for p in polygons if p.area &gt; 0])
    return list(cascaded_union(regions).exterior.coords)