Returns a list of flags corresponding to the first time an item is seen

    Args:
        list_ (list): list of items

    Returns:
        flag_list

    Timing:
        import random
        import utool as ut

        def random_items(n, m):
            rng = random.Random(0)
            return [rng.randint(0, n) for _ in range(m)]

        m = 1000

        def method1(list_):
            seen = set()
            def unseen(item):
                if item in seen:
                    return False
                seen.add(item)
                return True
            flag_list = [unseen(item) for item in list_]
            return flag_list

        def method2(list_):
            return ut.index_to_boolmask([list_.index(x) for x in set(list_)], len(list_))

        def method3(list_):
            return ut.index_to_boolmask(dict(zip(reversed(list_), reversed(range(len(list_))))).values(), len(list_))


        import ubelt as ub
        ub.Timerit.DEFAULT_VERBOSE = False

        import plottool as pt
        ut.qtensure()
        exps = [0, .25, .5, .75, 1, 2]
        pnum_ = pt.make_pnum_nextgen(nSubplots=len(exps))
        current = ut.flag_unique_items

        for count, exp in ut.ProgIter(list(enumerate(exps, start=1))):
            ydatas = ut.ddict(list)
            xdata = []
            for m in ut.ProgIter(list(range(0, 10000, 100)), freq=1):
                xdata.append(m)
                num = 10
                n = int(m ** exp)
                list_ = random_items(n=n, m=m)
                ydatas['method1'].append(ub.Timerit(num).call(method1, list_))
                ydatas['method2'].append(ub.Timerit(num).call(method2, list_))
                ydatas['method3'].append(ub.Timerit(num).call(method3, list_))
                ydatas['current'].append(ub.Timerit(num).call(current, list_))

                # assert method1(list_) == method3(list_)
                # assert method1(list_) == current(list_)

            pt.multi_plot(
                xdata, list(ydatas.values()), label_list=list(ydatas.keys()),
                ylabel='time', title=str(exp), fnum=1, pnum=pnum_())

def flag_unique_items(list_):
    """
    Returns a list of flags corresponding to the first time an item is seen

    Args:
        list_ (list): list of items

    Returns:
        flag_list

    Timing:
        import random
        import utool as ut

        def random_items(n, m):
            rng = random.Random(0)
            return [rng.randint(0, n) for _ in range(m)]

        m = 1000

        def method1(list_):
            seen = set()
            def unseen(item):
                if item in seen:
                    return False
                seen.add(item)
                return True
            flag_list = [unseen(item) for item in list_]
            return flag_list

        def method2(list_):
            return ut.index_to_boolmask([list_.index(x) for x in set(list_)], len(list_))

        def method3(list_):
            return ut.index_to_boolmask(dict(zip(reversed(list_), reversed(range(len(list_))))).values(), len(list_))


        import ubelt as ub
        ub.Timerit.DEFAULT_VERBOSE = False

        import plottool as pt
        ut.qtensure()
        exps = [0, .25, .5, .75, 1, 2]
        pnum_ = pt.make_pnum_nextgen(nSubplots=len(exps))
        current = ut.flag_unique_items

        for count, exp in ut.ProgIter(list(enumerate(exps, start=1))):
            ydatas = ut.ddict(list)
            xdata = []
            for m in ut.ProgIter(list(range(0, 10000, 100)), freq=1):
                xdata.append(m)
                num = 10
                n = int(m ** exp)
                list_ = random_items(n=n, m=m)
                ydatas['method1'].append(ub.Timerit(num).call(method1, list_))
                ydatas['method2'].append(ub.Timerit(num).call(method2, list_))
                ydatas['method3'].append(ub.Timerit(num).call(method3, list_))
                ydatas['current'].append(ub.Timerit(num).call(current, list_))

                # assert method1(list_) == method3(list_)
                # assert method1(list_) == current(list_)

            pt.multi_plot(
                xdata, list(ydatas.values()), label_list=list(ydatas.keys()),
                ylabel='time', title=str(exp), fnum=1, pnum=pnum_())

    """
    len_ = len(list_)
    item_to_index = dict(zip(reversed(list_), reversed(range(len_))))
    flag_list = index_to_boolmask(item_to_index.values(), len_)
    return flag_list