- A+

`l1 = ['A','B','C','D','A','B'] l2 = [] `

'C' is the first value in list l1, i want to create a function so that it returns C in l2.

In 3.6 and higher, this is *very* easy. Now that `dict`

s preserve insertion order, `collections.Counter`

can be used to efficiently count *all* elements in a single pass, then you can just scan the resulting `Counter`

in order to find the first element with a count of 1:

`from collections import Counter l1 = ['A','B','C','D','A','B'] l2 = [next(k for k, v in Counter(l1).items() if v == 1)] `

Work is strictly `O(n)`

, with only one pass of the input required (plus a partial pass of the unique values in the `Counter`

itself), and the code is incredibly simple. In modern Python, `Counter`

even has a C accelerator for counting inputs that pushes all the `Counter`

construction work to the C layer, making it impossible to beat. If you want to account for the possibility that no such element exists, just wrap the `l2`

initialization to make it:

`try: l2 = [next(k for k, v in Counter(l1).items() if v == 1)] except StopIteration: l2 = [] # ... whatever else makes sense for your scenario ... `

or avoid exception handling with `itertools.islice`

(so `l2`

is 0-1 items, and it still short-circuits once a hit is found):

`from itertools import islice l2 = list(islice((k for k, v in Counter(l1).items() if v == 1), 1)) `