[ Foro de Python ]

ReverseK method python simple list

01-Mar-2022 19:06
Invitado (Iv?n Llorente)
2 Respuestas

reverse(k): la función debe invertir los elementos de la lista invocante en
grupos de k elementos. Si k<=1, no se realiza ninguna transformación. Si
k>=len(self), se debe invertir la lista completa. Aquí tenéis algunos ejemplos:

Entrada: self: 1 -> 8 -> 7 -> 2 -> 5 -> 4 -> 6 -> 8, k=2
Qué hace la función: self: 8->1 ->2-> 7 -> 4 -> 5 -> 8 -> 6
Explicación:
El primer grupo de k=2 elementos es 1->8, su inversa es 8->1
El segundo grupo de k=2 elementos es 7->2, su inversa es 2->7
El tercer grupo de k=2 elementos es 4->5, su inversa es 5->4
El cuarto grupo de k=2 elementos es 6->8, su inversa es 8->6

Entrada: self: 1 -> 8 -> 7 -> 2 -> 5 -> 4 -> 6 -> 8, k=3
Qué hace la función: self: 7->8->1->4->5->2->8 -> 6
Como la última sublista 6->8 tiene una longitud menor que k=3, nos limitamos a invertirla.
Explicación:
El primer grupo de k=3 elementos es 1->8->7, su inversa es 7->8->1
El segundo grupo de k=3 elementos es 2->5->4, su inversa es 4->5->2
Ahora en la lista ya solo quedan dos elementos 6->8, su inversa es 6->8

A pesar de que existen muchas opciones de listas enlazadas, ya sean las doblemente enlazadas o las simples con head y tail, mi objetivo es implementar esta función con únicamente self.head

He conseguido desarrollar la función reverse sin ninguna complicación pero me está costando implementar que esta se ejecute en pequeños grupos de nodos (funcionamiento arriba explicado)


06-Mar-2022 17:01
Invitado (An?nimo)

El problema de los "pequeños grupos de nodos" se puede resolver de muchas formas. Un generador es una buena opción. Te pongo un ejemplo de como conseguir lo que quieres hacer. Sólo tienes que adaptarlo al diseño de tu clase:

#Devuelve una lista con "trocitos" de lista. Tú especificas el tamaño.

def make_slices():
result=[]
def slicer(string,size):
result=[string[n:n+size] for n in range(0,len(string),size)]
return result
return slicer


def reverse(lst,k):
slcr=make_slices()
if k<=1:
return lst
if k>=len(lst):
return(lst[::-1])
retval=slcr(lst,k)
for el in retval:
print(el[::-1])

Si tenemos por ejemplo la lista:
lista=[1,8,7,2,5,4,6,8]

para la llamada a:
reverse(lista,3)
obtienes:
[7, 8, 1]
[4, 5, 2]
[8, 6]

Para la llamada a
reverse(lista,2)
obtienes:
[8, 1]
[2, 7]
[4, 5]
[8, 6]

Para:
reverse(lista,18)
obtienes:
[8, 6, 4, 5, 2, 7, 8, 1]

Espero que te ayude.


06-Mar-2022 17:09
Invitado (An?nimo)

En mi anterior respuesta hablaba de generadores. Quería decir closures, perdona el despiste.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)