(ohjelmoinnin perusteet -kurssilta)
import re
def tavut(sana):
    return re.findall("[bcdfghjklmnpqrstvwxz]*" +
                      "(?:[aeiouyäö]i|[aeiou]u|[äeiöy]y" +
                      "|aa|ää|[ie]e|[uo]o|[yö]ö|[aeiouyäö])" +
                      "(?:[bcdfghjklmnpqrstvwxz]+(?![aeiouyäö]))?",
                      sana, re.IGNORECASE)
def jollekin(lista): return True in lista
def kaikille(lista): return False not in lista
def sisaltaako_tavuduplikaation(sana):
    tavulista = tavut(sana)
    return jollekin([tavu == seuraava
                     for tavu, seuraava in zip(tavulista, tavulista[1:])])
def sotke_sanajarjestys(lause):
    return ' '.join(sotke_lista(lause.split()))
def even(n): return n % 2 == 0
def sotke_lista(ls):
    if not even(len(ls)): return sotke_lista(ls[:-1]) + [ls[-1]]
    return [ls[index + 1 - 2 * (index % 2)] for index in range(len(ls))]
def sotke_sanajarjestys(lause):
    return sotke_ja_yhdistele(lause.split())
def sotke_ja_yhdistele(lista):
    if len(lista) % 2 == 1:
        return sotke_ja_yhdistele(lista[:-1]) + ' ' + lista[-1]
    sanat1 = lista[0::2]
    sanat2 = lista[1::2]
    yhdistellyt = [sana2 + ' ' + sana1 for sana1, sana2 in zip(sanat1, sanat2)]
    return ' '.join(yhdistellyt)
def flatten(lsls):
    return [e for ls in lsls for e in ls]
def sotke_lista(ls):
    if not even(len(ls)): return sotke_lista(ls[:-1]) + [ls[-1]]
    return flatten([[sana2, sana1]
                    for sana1, sana2 in zip(ls[0::2], ls[1::2])])
def sotke_lista(ls):
    if not even(len(ls)): return sotke_lista(ls[:-1]) + [ls[-1]]
    return [sana for sana1, sana2 in zip(ls[0::2], ls[1::2])
                 for sana in [sana2, sana1]]