@_with_element
def multiselect(self, element, label, options, default=None, format_func=str, key=None):
    "Display a multiselect widget.\n        The multiselect widget starts as empty.\n\n        Parameters\n        ----------\n        label : str\n            A short label explaining to the user what this select widget is for.\n        options : list, tuple, numpy.ndarray, or pandas.Series\n            Labels for the select options. This will be cast to str internally\n            by default.\n        default: [str] or None\n            List of default values.\n        format_func : function\n            Function to modify the display of selectbox options. It receives\n            the raw option as an argument and should output the label to be\n            shown for that option. This has no impact on the return value of\n            the selectbox.\n        key : str\n            An optional string to use as the unique key for the widget.\n            If this is omitted, a key will be generated for the widget\n            based on its content. Multiple widgets of the same type may\n            not share the same key.\n\n        Returns\n        -------\n        [str]\n            A list with the selected options\n\n        Example\n        -------\n        >>> options = st.multiselect(\n        ...     'What are your favorite colors',\n        ...     ['Green', 'Yellow', 'Red', 'Blue'],\n        ...     ['Yellow', 'Red'])\n        >>>\n        >>> st.write('You selected:', options)\n\n        .. note::\n           User experience can be degraded for large lists of `options` (100+), as this widget\n           is not designed to handle arbitrary text search efficiently. See this\n           `thread <https://discuss.streamlit.io/t/streamlit-loading-column-data-takes-too-much-time/1791>`_\n           on the Streamlit community forum for more information and\n           `GitHub issue #1059 <https://github.com/streamlit/streamlit/issues/1059>`_ for updates on the issue.\n\n        "

    def _check_and_convert_to_indices(options, default_values):
        if ((default_values is None) and (None not in options)):
            return None
        if (not isinstance(default_values, list)):
            if (is_type(default_values, 'numpy.ndarray') or is_type(default_values, 'pandas.core.series.Series')):
                default_values = list(default_values)
            elif (not default_values):
                default_values = [default_values]
            else:
                default_values = list(default_values)
        for value in default_values:
            if (value not in options):
                raise StreamlitAPIException('Every Multiselect default value must exist in options')
        return [options.index(value) for value in default_values]
    indices = _check_and_convert_to_indices(options, default)
    element.multiselect.label = label
    default_value = ([] if (indices is None) else indices)
    element.multiselect.default[:] = default_value
    element.multiselect.options[:] = [str(format_func(option)) for option in options]
    ui_value = _get_widget_ui_value('multiselect', element, user_key=key)
    current_value = (ui_value.value if (ui_value is not None) else default_value)
    return [options[i] for i in current_value]
Display a multiselect widget.
The multiselect widget starts as empty.

Parameters
----------
label : str
    A short label explaining to the user what this select widget is for.
options : list, tuple, numpy.ndarray, or pandas.Series
    Labels for the select options. This will be cast to str internally
    by default.
default: [str] or None
    List of default values.
format_func : function
    Function to modify the display of selectbox options. It receives
    the raw option as an argument and should output the label to be
    shown for that option. This has no impact on the return value of
    the selectbox.
key : str
    An optional string to use as the unique key for the widget.
    If this is omitted, a key will be generated for the widget
    based on its content. Multiple widgets of the same type may
    not share the same key.

Returns
-------
[str]
    A list with the selected options

Example
-------
>>> options = st.multiselect(
...     'What are your favorite colors',
...     ['Green', 'Yellow', 'Red', 'Blue'],
...     ['Yellow', 'Red'])
>>>
>>> st.write('You selected:', options)

.. note::
   User experience can be degraded for large lists of `options` (100+), as this widget
   is not designed to handle arbitrary text search efficiently. See this
   `thread <https://discuss.streamlit.io/t/streamlit-loading-column-data-takes-too-much-time/1791>`_
   on the Streamlit community forum for more information and
   `GitHub issue #1059 <https://github.com/streamlit/streamlit/issues/1059>`_ for updates on the issue.
@_with_element
def multiselect(self, element, label, options, default=None, format_func=str, key=None):
    "Display a multiselect widget.\n        The multiselect widget starts as empty.\n\n        Parameters\n        ----------\n        label : str\n            A short label explaining to the user what this select widget is for.\n        options : list, tuple, numpy.ndarray, or pandas.Series\n            Labels for the select options. This will be cast to str internally\n            by default.\n        default: [str] or None\n            List of default values.\n        format_func : function\n            Function to modify the display of selectbox options. It receives\n            the raw option as an argument and should output the label to be\n            shown for that option. This has no impact on the return value of\n            the selectbox.\n        key : str\n            An optional string to use as the unique key for the widget.\n            If this is omitted, a key will be generated for the widget\n            based on its content. Multiple widgets of the same type may\n            not share the same key.\n\n        Returns\n        -------\n        [str]\n            A list with the selected options\n\n        Example\n        -------\n        >>> options = st.multiselect(\n        ...     'What are your favorite colors',\n        ...     ['Green', 'Yellow', 'Red', 'Blue'],\n        ...     ['Yellow', 'Red'])\n        >>>\n        >>> st.write('You selected:', options)\n\n        .. note::\n           User experience can be degraded for large lists of `options` (100+), as this widget\n           is not designed to handle arbitrary text search efficiently. See this\n           `thread <https://discuss.streamlit.io/t/streamlit-loading-column-data-takes-too-much-time/1791>`_\n           on the Streamlit community forum for more information and\n           `GitHub issue #1059 <https://github.com/streamlit/streamlit/issues/1059>`_ for updates on the issue.\n\n        "

    def _check_and_convert_to_indices(options, default_values):
        if ((default_values is None) and (None not in options)):
            return None
        if (not isinstance(default_values, list)):
            if (is_type(default_values, 'numpy.ndarray') or is_type(default_values, 'pandas.core.series.Series')):
                default_values = list(default_values)
            elif (not default_values):
                default_values = [default_values]
            else:
                default_values = list(default_values)
        for value in default_values:
            if (value not in options):
                raise StreamlitAPIException('Every Multiselect default value must exist in options')
        return [options.index(value) for value in default_values]
    indices = _check_and_convert_to_indices(options, default)
    element.multiselect.label = label
    default_value = ([] if (indices is None) else indices)
    element.multiselect.default[:] = default_value
    element.multiselect.options[:] = [str(format_func(option)) for option in options]
    ui_value = _get_widget_ui_value('multiselect', element, user_key=key)
    current_value = (ui_value.value if (ui_value is not None) else default_value)
    return [options[i] for i in current_value]