def normalize_run_info(run_info):
    """Normalize all dictionaries describing a run.

    Args:
        run_info (List[Dict]): The list of dictionaries to be normalized.
    Returns:
        List[Dict]: The input run_info but with each dictionary now having all the same keys. Note
            that there will be empty string values when a key was not originally found on a
            dictionary.
    """
    keys = set([])
    for run in run_info:
        keys.update(run.keys())

    def get_run_info_with_blanks(run):
        """Ensure all of the required keys are found on a single run dictionary.

        Args:
            run (Dict): The run's original dictionary.
        Returns:
            Dict: The input run dictionary with all of the required keys. Empty string values will
                be added when a required key is not present.
        """
        return dict(zip(keys, map(lambda x: run.get(x, ''), keys)))

    return list(map(get_run_info_with_blanks, run_info))