If you're looking for both memory efficient and fast solution then you can use itertools.islice
with itertools.chain
here. This is going to be faster than @utdemir's solution because in filtering step no Python for-loop is involved:
from itertools import islice, chain
def islice_ashwch(my_list):
for i, j in enumerate(my_list):
for elem in chain(islice(my_list, i), islice(my_list, i+1, None)):
pass
def gen_utd(my_list):
#https://stackoverflow.com/a/22944093/846892
for i, j in enumerate(my_list):
for elem in (v for k, v in enumerate(my_list) if k != i):
pass
Timing comparison:
In [6]: lst = range(100)
In [7]: %timeit gen_utd(lst)
1000 loops, best of 3: 680 µs per loop
In [8]: %timeit islice_ashwch(lst)
1000 loops, best of 3: 204 µs per loop
In [9]: lst = range(1000)
In [10]: %timeit gen_utd(lst)
10 loops, best of 3: 63.3 ms per loop
In [11]: %timeit islice_ashwch(lst)
100 loops, best of 3: 16.2 ms per loop