def to_list(obj, split_strings=True):
    """
    Converts a obj, an iterable or a single item to a list.

    Args:
        obj (mixed): Object to convert item or wrap.
        split_strings (bool, optional): Whether to split strings into single chars. Defaults to
            ``True``.

    Returns:
        list: Converted obj or wrapped item.

    Example:

        >>> results = to_list({'a': 1, 'b': 2, 'c': 3})
        >>> assert set(results) == set([1, 2, 3])

        >>> to_list((1, 2, 3, 4))
        [1, 2, 3, 4]

        >>> to_list(1)
        [1]

        >>> to_list([1])
        [1]

        >>> to_list(a for a in [1, 2, 3])
        [1, 2, 3]

        >>> to_list('cat')
        ['c', 'a', 't']

        >>> to_list('cat', split_strings=False)
        ['cat']

    .. versionadded:: 1.0.0

    .. versionchanged:: 4.3.0

        - Wrap non-iterable items in a list.
        - Convert other iterables to list.
        - Byte objects are returned as single character strings in Python 3.
    """
    if isinstance(obj, list):
        return obj[:]
    elif isinstance(obj, dict):
        return obj.values()
    elif not split_strings and isinstance(obj, (str, bytes)):
        return [obj]
    elif split_strings and isinstance(obj, bytes):
        # in python3 iterating over bytes gives integers instead of strings
        return list(chr(c) if isinstance(c, int) else c for c in obj)
    else:
        try:
            return list(obj)
        except TypeError:
            return [obj]