nodes: 0, module; 1, function_definition; 2, function_name:build_markdown_table; 3, parameters; 4, block; 5, identifier:headers; 6, identifier:rows; 7, default_parameter; 8, expression_statement; 9, expression_statement; 10, expression_statement; 11, expression_statement; 12, for_statement; 13, return_statement; 14, identifier:row_keys; 15, None; 16, comment:"""Build a lined up markdown table.
  
      Args:
          headers (dict): A key -> value pairing fo the headers.
          rows (list): List of dictionaries that contain all the keys listed in
          the headers.
          row_keys (list): A sorted list of keys to display
  
      Returns:
          A valid Markdown Table as a string.
      """; 17, assignment; 18, assignment; 19, assignment; 20, identifier:row; 21, identifier:rows; 22, block; 23, binary_operator:'\n'.join(table) + '\n'; 24, identifier:row_maxes; 25, call; 26, identifier:row_keys; 27, boolean_operator; 28, identifier:table; 29, list; 30, expression_statement; 31, call; 32, string; 33, identifier:_find_row_maxes; 34, argument_list; 35, identifier:row_keys; 36, list_comprehension; 37, call; 38, call; 39, call; 40, attribute; 41, argument_list; 42, string_content; 43, identifier:headers; 44, identifier:rows; 45, identifier:key; 46, for_in_clause; 47, identifier:_build_row; 48, argument_list; 49, identifier:_build_separator; 50, argument_list; 51, attribute; 52, argument_list; 53, string; 54, identifier:join; 55, identifier:table; 56, escape_sequence:\n; 57, pattern_list; 58, call; 59, identifier:headers; 60, identifier:row_maxes; 61, identifier:row_keys; 62, identifier:row_maxes; 63, identifier:row_keys; 64, identifier:table; 65, identifier:append; 66, call; 67, string_content; 68, identifier:key; 69, identifier:value; 70, attribute; 71, argument_list; 72, identifier:_build_row; 73, argument_list; 74, escape_sequence:\n; 75, identifier:headers; 76, identifier:items; 77, identifier:row; 78, identifier:row_maxes; 79, identifier:row_keys
code: def build_markdown_table(headers, rows, row_keys=None):
      """Build a lined up markdown table.
  
      Args:
          headers (dict): A key -> value pairing fo the headers.
          rows (list): List of dictionaries that contain all the keys listed in
          the headers.
          row_keys (list): A sorted list of keys to display
  
      Returns:
          A valid Markdown Table as a string.
      """
      row_maxes = _find_row_maxes(headers, rows)
      row_keys = row_keys or [key for key, value in headers.items()]
      table = [
          _build_row(headers, row_maxes, row_keys),
          _build_separator(row_maxes, row_keys)
      ]
  
      for row in rows:
          table.append(_build_row(row, row_maxes, row_keys))
      return '\n'.join(table) + '\n'