code: def groupby2(records, kfield, vfield):
      
      if isinstance(kfield, tuple):
          kgetter = operator.itemgetter(*kfield)
      else:
          kgetter = operator.itemgetter(kfield)
      if isinstance(vfield, tuple):
          vgetter = operator.itemgetter(*vfield)
      else:
          vgetter = operator.itemgetter(vfield)
      dic = groupby(records, kgetter, lambda rows: [vgetter(r) for r in rows])
      return list(dic.items())
docs: :param records: a sequence of records with positional or named fields
      :param kfield: the index/name/tuple specifying the field to use as a key
      :param vfield: the index/name/tuple specifying the field to use as a value
      :returns: an list of pairs of the form (key, [value, ...]).
  
      >>> groupby2(['A1', 'A2', 'B1', 'B2', 'B3'], 0, 1)
      [('A', ['1', '2']), ('B', ['1', '2', '3'])]
  
      Here is an example where the keyfield is a tuple of integers:
  
      >>> groupby2(['A11', 'A12', 'B11', 'B21'], (0, 1), 2)
      [(('A', '1'), ['1', '2']), (('B', '1'), ['1']), (('B', '2'), ['1'])]