code: def unique_and_equal(found, expected, name, step, marker_line):
      # check for any notebooks listed more than once
      repeated = [
          name for name, count in Counter(found).items() if count > 1
      ]
      if repeated:
          repeated_str = ", ".join(repeated)
          error(
              f"found {len(repeated)} {name} listed twice: {repeated_str}",
              marker_line,
          )
  
      listed = set(found)
  
      if listed != expected:
          extra = listed - expected
          missing = expected - listed
  
          message = [
              f"found list of {len(listed)} {name} in '{step}' to be different to the {len(expected)} {name} on disk"
          ]
  
          if extra:
              extra_str = ", ".join(sorted(extra))
              message.append(
                  f"{name} listed but not on disk: {extra_str}"
              )
          if missing:
              missing_str = ", ".join(sorted(missing))
              message.append(
                  f"{name} on disk but not listed: {missing_str}"
              )
  
          error("; ".join(message), marker_line)
  
      print(
          f"{WORKFLOW}:{marker_line}: success: listed {name} matches {name} on disk"
      )
  
file_path: stellargraph/scripts/ci/validate_ci_workflow.py
imports: import yaml
  import sys
  import glob
  import os
  from collections import Counter
label_desc: Use image node_id 4 for calling a global function with example usage: unique_and_equal(found, expected, name, step, marker_line) without return types