In your code W defines the range of the loop but changes inside.
It can be improved as follows:
T=Tuples((0,1),4)
W=[matrix(2,2,v) for v in T]
V=W.copy()
[V.remove(s) for s in W if s.is_symmetric()]
V
[
[0 1] [1 1] [0 0] [1 0] [0 1] [1 1] [0 0] [1 0]
[0 0], [0 0], [1 0], [1 0], [0 1], [0 1], [1 1], [1 1]
]
but it is better not to construct to many matrices:
import itertools
def f():
f1=lambda x:matrix(2,2,x)
f2=lambda v:v[1]!=v[2]
T=(item for item in itertools.product([0,1], repeat=4))
return list(map(f1,filter(f2,T)))
f()
[
[0 0] [0 0] [0 1] [0 1] [1 0] [1 0] [1 1] [1 1]
[1 0], [1 1], [0 0], [0 1], [1 0], [1 1], [0 0], [0 1]
]
timeit('f()')
625 loops, best of 3: 40.7 μs per loop
In intel python, replacing matrix by numpy.array one can obtain two times faster code