Как решить задачу правильно?
Подобная задача проще всего решается через стэк.
Перебираем постепенно элементы исходного списка.
Если последний элемент стэка равен противоположному (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
S=["NORTH", "WEST", "SOUTH", "EAST"]
pair1={"WEST", "EAST" }
pair2={"NORTH", "SOUTH"}

for i in range(len(S)-1,-1,-1):
    if {S[i], S[i - 1]} ==pair1 or {S[i], S[i - 1]} ==pair2:
        S.pop(i)
        S.pop(i-1)

print(S)

не уверен на 100% что верно, но оба примера проходят..)