input: Write a function to create a class named Matrix in Python that can perform various matrix operations such as addition, subtraction, multiplication, and transpose. The class should be initialized with the dimensions of the matrix (m and n) and a list of its elements. The class should also have methods to return the matrix as a string, add another matrix, subtract another matrix, multiply by another matrix, and transpose the matrix itself.
  
  class Matrix: 
      def __init__(self, m, n, lst): 
          self.m = m             
          self.n = n             
          self.mat = [] 
    
          c = 0
          for i in range(self.m): 
              a =[] 
              for j in range(self.n): 
                      a.append(lst[c]) 
                      c += 1
              self.mat.append(a) 
    
      def __str__(self): 
          output = ""
          for i in self.mat: 
              for j in i: 
                  output += str(j) + " "
              output += '\n'
          return output 
    
      def add(self, mat2): 
          for i in range(self.m): 
              for j in range(self.n): 
                  self.mat[i][j] += mat2.mat[i][j] 
    
      def sub(self, mat2): 
          for i in range(self.m): 
              for j in range(self.n): 
                  self.mat[i][j] -= mat2.mat[i][j]
      
      def mul(self, mat2): 
          result = [] 
          for i in range(self.m): 
              a =[] 
              for j in range(mat2.n): 
                  s = 0
                  for k in range(self.n): 
                      s += self.mat[i][k] * mat2.mat[k][j] 
                  a.append(s) 
              result.append(a) 
          self.mat = result 
          self.m = len(result) 
          self.n = len(result[0]) 
    
      def transpose(self):
          result = [[self.mat[j][i] for j in range(len(self.mat))] for i in range(len(self.mat[0]))]
          self.mat = result 
          self.m = len(result) 
          self.n = len(result[0])
          
  assert str(Matrix(2, 3, [1, 2, 3, 4, 5, 6])) == "1 2 3 \n4 5 6 \n"
  assert str(Matrix(2, 3, [1, 2, 3, 4, 5, 6]).add(Matrix(2, 3, [2, 2, 2, 2, 2, 2]))) == Matrix(2, 3, [3, 4, 5, 6, 7, 8]).__str__()
  assert str(Matrix(2, 3, [3, 4, 5, 6, 7, 8]).sub(Matrix(2, 3, [1, 1, 1, 1, 1, 1]))) == Matrix(2, 3, [2, 3, 4, 5, 6, 7]).__str__()
  assert str(Matrix(2, 3, [1, 2, 3, 4, 5, 6]).mul(Matrix(3, 2, [1, 2, 3, 4, 5, 6]))) == Matrix(2, 2, [22, 28, 49, 64]).__str__()
  assert str(Matrix(2, 3, [1, 2, 3, 4, 5, 6]).transpose()) == Matrix(3, 2, [1, 4, 2, 5, 3, 6]).__str__()
output: 
  def __init__(self, m, n, lst): 
      self.m = m             
      self.n = n             
      self.mat = [] 
  
      c = 0
      for i in range(self.m): 
          a =[] 
          for j in range(self.n): 
                  a.append(lst[c]) 
                  c += 1
          self.mat.append(a) 
  
  def __str__(self): 
      output = ""
      for i in self.mat: 
          for j in i: 
              output += str(j) + " "
          output += '\n'
      return output 
  
  def add(self, mat2): 
      for i in range(self.m): 
          for j in range(self.n): 
              self.mat[i][j] += mat2.mat[i][j] 
  
  def sub(self, mat2): 
      for i in range(self.m): 
          for j in range(self.n): 
              self.mat[i][j] -= mat2.mat[i][j]
  
  def mul(self, mat2): 
      result = [] 
      for i in range(self.m): 
          a =[] 
          for j in range(mat2.n): 
              s = 0
              for k in range(self.n): 
                  s += self.mat[i][k] * mat2.mat[k][j] 
              a.append(s) 
          result.append(a) 
      self.mat = result 
      self.m = len(result) 
      self.n = len(result[0]) 
  
  def transpose(self):
      result = [[self.mat[j][i] for j in range(len(self.mat))] for i in range(len(self.mat[0]))]
      self.mat = result 
      self.m = len(result) 
      self.n = len(result[0])
  