domingo, 13 de dezembro de 2015

Dicionários

Suponha escreveu um livro e tem dois índices: um, com os capítulos e as páginas de início e de fim do capítulo. Outro, o índice remissivo, com as palavras e as páginas onde ocorrem. Pretendemos estabelecer uma nova associação em que as palavras têm associadas os capítulos onde aparecem. Vejamos como podemos resolver esta questão. Comecemos por pensar na organização dos índices: como dicionários.
    indice = {'c1':[1,34], 'c2': [35,42], 'c3':[43,52],'c4':[53,60]}
    remissivo = {‘p1':[2,54],'p2':[36,37,50],'p3':[40]}
Agora a solução. Sabemos que queremos passar das palavras aos capítulos. Então uma ideia simples é a de percorrer os dicionários das palavras e, por cada palavra e por cada página em que ocorre, procurar qual o capítulo.
def cap_pal(indice, remissivo):
# inicializa novo dicionário
    sol = dict()
    # percorre indice remissivo por palavra
    for palavra, pgs in remissivo.items():
        # percorre por pagina
        #  para cada pagina onde ocorre a palavra determina o capitaulo
        # actualiza o dicionário e passa à palavra seguinte
    return sol
Tornemos este esboço mais concreto.
def cap_pal(indice, remissivo):
    sol = dict()
    # percorre por palavra
    for palavra, pgs in remissivo.items():
        # percorre por pagina
        cap = []
        for pagina in pgs:
            c = capitulo(indice,pagina)
            if c not in cap:
                cap.append(c)
        sol[palavra] = cap
    return sol
Esta solução tem o cuidado de não acrescentar mais do que uma vez o capítulo, ou seja, se a palavra ocorrer mais do que uma vez no capítulo tal só é indicado uma vez. Mas falta-nos escrever o código que determina em que capítulo está uma dada página.
def capitulo(dicio,pg):
    for ch, val in dicio.items():
        if val[0] <= pg <= val[1]:
            return ch

    return None
Percorremos o dicionário extraindo as páginas de início e de fim para cada capítulo e tentamos saber em que intervalo está a nossa página, para definir o capítulo. E pronto. Podemos passar ao exercício seguinte…

Sem comentários:

Enviar um comentário