Prova 2: junta()

Prova 2: junta()

por José Coelho de Pina -
Número de respostas: 1
def junta(lstA, lstB):
    ''' (list, list) -> list
    Recebe duas listas lstA e lstB com números. 
    Os números de cada lista estão em ordem não-decrescente. 
    A função retorna uma lista contendo todos os números em lstA e em lstB 
    em ordem crescente e sem repetições.

    Exemplos:
    >>> junta([2, 5], [1, 2, 2, 3])
    [1,2,3,5]

    >>> junta([-4, -4, 10, 20], [-40, -4, 5, 15, 20])
    [-40, -4, 5, 10, 15, 20]

    >>> junta([], [110])
    [110]
    '''
    lst = [] 
    nA = len(lstA)
    nB = len(lstB)
    iA = 0 # índice para percorrer lstA
    iB = 0 # índice para percorrer lstB
    for i in range(0, nA+nB, 1):
        if iA == nA: # lstA acabou?
            if not pertence(lstB[iB], lst): # evita elemento repetido
                lst += [lstB[iB]]
            iB += 1
        elif iB == nB: # lstB acabou?
            if not pertence(lstA[iA], lst): # evita elemento repetido
                lst += [lstA[iA]]
            iA += 1
        elif lstA[iA] <= lstB[iB]: # nenhuma das lista é vazia 
            if not pertence(lstA[iA], lst): # evita elemento repetido
                 lst += [lstA[iA]]
            iA += 1
        else: # lstB[iB] < lstA[iA]
            if not pertence(lstB[iB], lst): # evita elemento repetido
                 lst += [lstB[iB]]
            iB += 1
    return lst
Em resposta à José Coelho de Pina

Re: Prova 2: junta()

por José Coelho de Pina -
def junta(lstA, lstB):
    ''' (list, list) -> list
    Recebe duas listas lstA e lstB com números. 
    Os números de cada lista estão em ordem não-decrescente. 
    A função retorna uma lista contendo todos os números em lstA e em lstB 
    em ordem crescente e sem repetições.

    Exemplos:
    >>> junta([2, 5], [1, 2, 2, 3])
    [1,2,3,5]

    >>> junta([-4, -4, 10, 20], [-40, -4, 5, 15, 20])
    [-40, -4, 5, 10, 15, 20]

    >>> junta([], [110])
    [110]
    '''
    lst = [] 
    nA = len(lstA)
    nB = len(lstB)
    iA = 0 # índice para percorrer lstA
    iB = 0 # índice para percorrer lstB
    while iA < nA and iB < nB:
        if lstA[iA] <= lstB[iB]: # nenhuma das lista é vazia 
            if not pertence(lstA[iA], lst): # evita elemento repetido
                 lst += [lstA[iA]]
            iA += 1
        else: # lstB[iB] < lstA[iA]
            if not pertence(lstB[iB], lst): # evita elemento repetido
                 lst += [lstB[iB]]
            iB += 1

    # se lstB acabou, copia o que sobrou em lstA        
    while iA < nA:
        if not pertence(lstA[iA], lst): # evita elemento repetido
            lst += [lstA[iA]]
        iA += 1

    # se lstA acabou, copia o que sobrou em lstB                
    while iB < nB:
        if not pertence(lstB[iB], lst): # evita elemento repetido
            lst += [lstB[iB]]
        iB += 1

    return lst