Python - Comprimir y descoprimir listas

 
Vista:

Comprimir y descoprimir listas

Publicado por Error en mi programa (12 intervenciones) el 05/11/2017 17:51:42
Hola, necesito que me echen una mano con este ejercicio:
El apartado a) no puedo comprobarlo por que ordenador tiene muy poca potencia y no me va yme gustaría que me dijera alguien si es correcto. El apartado b) tengo algo mal pero no sé el qué, ya que me solo me devuelve el último elemento de la lista que descoprime.
Espero que alguien me eche un cable.
Gracias.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# En este ejercicio vamos a "comprimir" y "descomprimir" listas.
 
#  Apartado (a).
#  Definir la función compresion(l) que devuelva la lista resultante de
#  comprimir la lista l que recibe como entrada, en el siguiente sentido: 
#  * Si el elemento x aparece n (n > 1) veces de manera consecutiva en l
#    sustituimos esas n ocurrencias por la tupla (n, x)
#  * Si el elemento x es distinto de sus vecinos, entonces lo dejamos
#    igual
#  Ejemplo:
 
#  >>> compresión([1, 1, 1, 2, 1, 3, 2, 4, 4, 6, 8, 8, 8])
#  [[3, 1], 2, 1, 3, 2, [2, 4], 6, [3, 8]]
#  >>> compresión(["a", "a", "a", "b", "a", "c", "b", "d", "d", "f", "h", "h", "h"])
#  [[3, 'a'], 'b', 'a', 'c', 'b', [2, 'd'], 'f', [3, 'h']]
 
def compresión(l):
    acum=0
    lcomp=[]
    for i in range(len(l)):
        while l[i]==l[i+1]:
            acum+=1
            x=[acum,l[i]]
        if l[i]!=l[i+1]:
            y=l[i]
        lcomp.append(x)
        lcomp.append(y)
    return lcomp
#  Apartado (b).
#  Definir la función descompresion(l) que devuelva la lista l descomprimida,
#  suponiendo que ha sido comprimida con el método del apartado anterior.
#  Ejemplo:
 
#  >>> descompresión([[3, 1], 2, 1, 3, 2, [2, 4], 6, [3, 8]])
#  [1, 1, 1, 2, 1, 3, 2, 4, 4, 6, 8, 8, 8]
# ----------------------------------------------------------------------------
def descompresión(l):
    for x in l:
        l_descomp=[]
        if type(x)==list:
            for i in range(x[0]):
                l_descomp.append(x[1])
        else:
            l_descomp.append(x)
    return l_descomp
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Comprimir y descoprimir listas

Publicado por kip (257 intervenciones) el 05/11/2017 18:23:14
Hola, te recomiendo no usar caracteres con acento como compresión en tu código, tu primera función esta bien pensada, el problema es que aquel while jamas se detendra por que ? pues porque la variable i jamas cambia y siempre estas verificando los mismos valores, por ende se quedara en el bucle de manera infinita..... Lo que se me ocurre, siguiendo la logica que intentas emplear, es usar un if y asi mismo una lista acumuladora, fijate en esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def compresion(l):
    acum = 0
    vAcum = []
    lcomp = []
    for i in range(len(l)):
        if (i + 1) < len(l) and l[i] == l[i+1]:
            acum += 1
            vAcum = [acum, l[i]]
            continue
        if vAcum:
            vAcum[0] += 1
            lcomp.append(vAcum)
            vAcum = []
            acum = 0
        else:
            lcomp.append(l[i])
    return lcomp

Verifico primero que el actual valor de i sumandole un 1 no supere el tamaño de la lista, puesto que si no lo hago me dara un error de fuera de rango, luego empleo lo que tu usaste en el while.
En caso de cumplirse la condicion, lo ue hago es simplemente rellenar las variables acumuladoras, tne en cuenta que no modifique mucho el codigo para que mantenga tu logica, luego uso el keyword continue, que lo que hace es avanzar a la siguiente iteracion sin ejecutar el codigo que continua Doc.
1
2
3
4
if (i + 1) < len(l) and l[i] == l[i+1]:
    acum += 1
    vAcum = [acum, l[i]]
    continue

Este bloque de aca, que no se ejecuta si la condición anterior se cumple, se ejecutara si la lista acumuladora tiene algun elemento dentro, si es asi entonces aumento el valor del primer elemento que como sabes el el numero de veces que se repite la variable y luego esta lista la almaceno dentro de la otra lista, al final simplemente hago un 'reset' de las variables acumuladoras.
1
2
3
4
5
if vAcum:
    vAcum[0] += 1
    lcomp.append(vAcum)
    vAcum = []
    acum = 0

Tu otra función la he probado y va de maravilla, por cierto no es que tu maquina tenga pocos recursos(trabajar con este pequeño código no es para tener una supermaquina) es que el while jamas terminaba !

Aqui unas pruebas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def compresion(l):
    acum = 0
    vAcum = []
    lcomp = []
    for i in range(len(l)):
        if (i + 1) < len(l) and l[i] == l[i+1]:
            acum += 1
            vAcum = [acum, l[i]]
            continue
        if vAcum:
            vAcum[0] += 1
            lcomp.append(vAcum)
            vAcum = []
            acum = 0
        else:
            lcomp.append(l[i])
    return lcomp
 
def descompresion(l):
    l_descomp = []
    for x in l:
        if type(x) is list:
            for i in range(x[0]):
                l_descomp.append(x[1])
        else:
            l_descomp.append(x)
    return l_descomp
 
lista = ["a", "a", "a", "b", "a", "c", "b", "d", "d", "f", "h", "h", "h"]
 
comprimida = compresion(lista)
descomprimida = descompresion(comprimida)
 
print('Lista comprimida', comprimida)
print('Lista descomprimida', descomprimida)

Me muestra:

1
2
Lista comprimida [[3, 'a'], 'b', 'a', 'c', 'b', [2, 'd'], 'f', [3, 'h']]
Lista descomprimida ['a', 'a', 'a', 'b', 'a', 'c', 'b', 'd', 'd', 'f', 'h', 'h', 'h']
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Comprimir y descoprimir listas

Publicado por Raquel (12 intervenciones) el 05/11/2017 20:02:01
Hola, muchísimas gracias. Lo que no entiendo es cuando pones if vAcum, ya que no he usado nunca un if con una variable solo sin ninguna condición.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar