nodes: 0, module; 1, function_definition; 2, function_name:replace_cells; 3, parameters; 4, block; 5, identifier:self; 6, identifier:key; 7, identifier:sorted_row_idxs; 8, expression_statement; 9, expression_statement; 10, expression_statement; 11, expression_statement; 12, expression_statement; 13, for_statement; 14, for_statement; 15, for_statement; 16, comment:"""Replaces cells in current selection so that they are sorted"""; 17, assignment; 18, assignment; 19, assignment; 20, assignment; 21, pattern_list; 22, attribute; 23, block; 24, identifier:key; 25, identifier:del_keys; 26, block; 27, identifier:key; 28, identifier:new_keys; 29, block; 30, pattern_list; 31, identifier:key; 32, identifier:new_keys; 33, dictionary; 34, identifier:del_keys; 35, list; 36, identifier:selection; 37, call; 38, identifier:__row; 39, identifier:__col; 40, identifier:__tab; 41, attribute; 42, identifier:code_array; 43, if_statement; 44, expression_statement; 45, expression_statement; 46, identifier:row; 47, identifier:col; 48, identifier:tab; 49, attribute; 50, argument_list; 51, identifier:self; 52, identifier:grid; 53, boolean_operator; 54, block; 55, call; 56, call; 57, attribute; 58, identifier:get_selection; 59, comparison_operator:__tab == tab; 60, line_continuation:\; 61, parenthesized_expression; 62, expression_statement; 63, if_statement; 64, attribute; 65, argument_list; 66, attribute; 67, argument_list; 68, attribute; 69, identifier:actions; 70, identifier:__tab; 71, identifier:tab; 72, boolean_operator; 73, assignment; 74, comparison_operator:__row != new_row; 75, block; 76, attribute; 77, identifier:pop; 78, identifier:key; 79, identifier:CellActions; 80, identifier:set_code; 81, identifier:self; 82, identifier:key; 83, subscript; 84, identifier:self; 85, identifier:grid; 86, not_operator; 87, comparison_operator:(__row, __col) in selection; 88, identifier:new_row; 89, call; 90, identifier:__row; 91, identifier:new_row; 92, expression_statement; 93, expression_statement; 94, attribute; 95, identifier:code_array; 96, identifier:new_keys; 97, identifier:key; 98, identifier:selection; 99, tuple; 100, identifier:selection; 101, attribute; 102, argument_list; 103, assignment; 104, call; 105, identifier:self; 106, identifier:grid; 107, identifier:__row; 108, identifier:__col; 109, identifier:sorted_row_idxs; 110, identifier:index; 111, identifier:__row; 112, subscript; 113, line_continuation:\; 114, call; 115, attribute; 116, argument_list; 117, identifier:new_keys; 118, tuple; 119, attribute; 120, argument_list; 121, identifier:del_keys; 122, identifier:append; 123, tuple; 124, identifier:new_row; 125, identifier:__col; 126, identifier:__tab; 127, attribute; 128, identifier:code_array; 129, tuple; 130, identifier:__row; 131, identifier:__col; 132, identifier:__tab; 133, identifier:self; 134, identifier:grid; 135, identifier:__row; 136, identifier:__col; 137, identifier:__tab
code: def replace_cells(self, key, sorted_row_idxs):
          """Replaces cells in current selection so that they are sorted"""
  
          row, col, tab = key
  
          new_keys = {}
          del_keys = []
  
          selection = self.grid.actions.get_selection()
  
          for __row, __col, __tab in self.grid.code_array:
              if __tab == tab and \
                 (not selection or (__row, __col) in selection):
                  new_row = sorted_row_idxs.index(__row)
                  if __row != new_row:
                      new_keys[(new_row, __col, __tab)] = \
                          self.grid.code_array((__row, __col, __tab))
                      del_keys.append((__row, __col, __tab))
  
          for key in del_keys:
              self.grid.code_array.pop(key)
  
          for key in new_keys:
              CellActions.set_code(self, key, new_keys[key])