Подобная задача проще всего решается через стэк.
Перебираем постепенно элементы исходного списка.
Если последний элемент стэка равен противоположному (NORTH-SOUTH и т.п.) текущего элемента списка, то удаляем (stack.pop()) этот элемент из стэка. В противном случае добавляем к стэку. В конце цикла в стэке останется только неисключенные элементы (без пар). Для соответствия пар можно задать словарь.
Примерно так (спрячу под спойлер, на случай если захочется реализовать самостоятельно):
spoilerdef dirReduc(arr):
dirs = {"NORTH": "SOUTH", "SOUTH": "NORTH", "EAST": "WEST", "WEST": "EAST"}
stack = []
for d in arr:
if stack and dirs[d] == stack[-1]:
stack.pop()
else:
stack.append(d)
return stack