<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def connected_sites( self, site_labels=None ):
 """ Searches the lattice to find sets of sites that are contiguously neighbouring. Mutually exclusive sets of contiguous sites are returned as Cluster objects. Args: site_labels (:obj:(List(Str)|Set(Str)|Str), optional):
 Labels for sites to be considered in the search. This can be a list:: [ 'A', 'B' ] a set:: ( 'A', 'B' ) or a string:: 'A'. Returns: (List(Cluster)):
 List of Cluster objects for groups of contiguous sites. """

        if site_labels:
           selected_sites = self.select_sites( site_labels )
        else:
           selected_sites = self.sites
        initial_clusters = [ cluster.Cluster( [ site ] ) for site in selected_sites ]
        if site_labels:
            blocking_sites = self.site_labels - set( site_labels )
            for c in initial_clusters:
                c.remove_sites_from_neighbours( blocking_sites )
        final_clusters = []
        while initial_clusters: # loop until initial_clusters is empty
            this_cluster = initial_clusters.pop(0)
            while this_cluster.neighbours:
                neighbouring_clusters = [ c for c in initial_clusters if this_cluster.is_neighbouring( c ) ] 
                for nc in neighbouring_clusters:
                    initial_clusters.remove( nc )
                    this_cluster = this_cluster.merge( nc ) 
            final_clusters.append( this_cluster )
        return final_clusters