code: def _construct_auto_distance(feature_names, column_names, column_types, sample):
      
  
      ## Make a dictionary from the column_names and column_types
      col_type_dict = {k: v for k, v in zip(column_names, column_types)}
  
      ## Loop through feature names, appending a distance component if the
      #  feature's type is *not* numeric. If the type *is* numeric, append it to
      #  the numeric_cols list, then at the end make a numeric columns distance
      #  component.
      composite_distance_params = []
      numeric_cols = []
  
      for c in feature_names:
          if col_type_dict[c] == str:
              composite_distance_params.append([[c], _turicreate.distances.levenshtein, 1])
          elif col_type_dict[c] == dict:
              composite_distance_params.append([[c], _turicreate.distances.jaccard, 1])
          elif col_type_dict[c] == array.array:
              composite_distance_params.append([[c], _turicreate.distances.euclidean, 1])
          elif col_type_dict[c] == list:
              only_str_lists = _validate_lists(sample[c], allowed_types=[str])
              if not only_str_lists:
                  raise TypeError("Only lists of all str objects are currently supported")
              composite_distance_params.append([[c], _turicreate.distances.jaccard, 1])
          elif col_type_dict[c] in [int, float, array.array, list]:
              numeric_cols.append(c)
          else:
              raise TypeError("Unable to automatically determine a distance "+\
                  "for column {}".format(c))
  
      # Make the standalone numeric column distance component
      if len(numeric_cols) > 0:
          composite_distance_params.append([numeric_cols, _turicreate.distances.euclidean, 1])
  
      return composite_distance_params
docs: Construct composite distance parameters based on selected features and their
      types.