code: def parse_reports(self, reports):
          
          violations_dict = defaultdict(list)
          for report in reports:
              output_lines = report.split('\n')
  
              for output_line_number, line in enumerate(output_lines):
                  match = self.pylint_expression.match(line)
  
                  # Ignore any line that isn't matched
                  # (for example, snippets from the source code)
                  if match is not None:
  
                      (pylint_src_path,
                       line_number,
                       pylint_code,
                       function_name,
                       message) = match.groups()
                      if pylint_code == self.dupe_code_violation:
                          files_involved = self._process_dupe_code_violation(
                              output_lines,
                              output_line_number,
                              message
                          )
                      else:
                          files_involved = [(pylint_src_path, line_number)]
  
                      for violation in files_involved:
                          pylint_src_path, line_number = violation
                          # If we're looking for a particular source file,
                          # ignore any other source files.
                          if function_name:
                              error_str = "{}: {}: {}".format(pylint_code, function_name, message)
                          else:
                              error_str = "{}: {}".format(pylint_code, message)
  
                          violation = Violation(int(line_number), error_str)
                          violations_dict[pylint_src_path].append(violation)
  
          return violations_dict
docs: Args:
              reports: list[str] - output from the report
          Return:
              A dict[Str:Violation]
              Violation is a simple named tuple Defined above