docs: def _add_list_row(self, feature_list, key=None):
          """ Add a list row to the matrix
  
          :param str key: key used when rows is a dict rather than an array
          :param feature_list: a list of features in the same order as column_names
  
          :raise IndexError: if the list doesnt match the expected number of columns
          """
          if len(feature_list) > len(self._column_name_list):
              raise IndexError("Input list must have %s columns or less" % len(self._column_name_list))
  
          # reset the row memoization
          self._row_memo = {}
  
          if key is not None:
              if key in self._row_name_idx:
                  self._rows[self._row_name_idx[key]] = feature_list
                  return
              else:
                  self._row_name_idx[key] = len(self._rows)
                  self._row_name_list.append(key)
  
          self._rows.append(feature_list)