code: def fast_pop(self, key=NOT_SET, index=NOT_SET):
  		
  		if index is NOT_SET and key is not NOT_SET:
  			index, popped_value = self._dict.pop(key)
  		elif key is NOT_SET:
  			if index is NOT_SET:
  				index = len(self._list) - 1
  				key, popped_value2 = self._list[-1]
  			else:
  				key, popped_value2 = self._list[index]
  				if index < 0:
  					index += len(self._list)
  			index2, popped_value = self._dict.pop(key)
  			assert index == index2
  		else:
  			raise KEY_AND_INDEX_ERROR
  
  		if key == self._list[-1][0]:
  			# The item we're removing happens to be the last in the list,
  			# no swapping needed
  			_, popped_value2 = self._list.pop()
  			assert popped_value is popped_value2
  			return popped_value, len(self._list), key, popped_value
  		else:
  			# Swap the last item onto the deleted spot and
  			# pop the last item from the list
  			self._list[index] = self._list[-1]
  			moved_key, moved_value = self._list.pop()
  			self._dict[moved_key] = (index, moved_value)
  			return popped_value, index, moved_key, moved_value
docs: Pop a specific item quickly by swapping it to the end.
  
  		Remove value with given key or index (last item by default) fast
  		by swapping it to the last place first.
  
  		Changes order of the remaining items (item that used to be last goes to
  		the popped location).
  		Returns tuple of (poped_value, new_moved_index, moved_key, moved_value).
  		If key is not found raises KeyError or IndexError.
  
  		Runs in O(1).