Autor Tema: Ordenar una lista o array bidimensional.  (Leído 5347 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Ordenar una lista o array bidimensional.
« en: 20 de Diciembre de 2021, 16:42:53 »
Hola gente ¿Cómo están?, les deseo un feliz Lunes para todos.
Les dejo mi inconveniente del momento, tengo esto en una lista
Como puedo hacer para ordenarla x ej. x el campo “fecha” y también
me gustaría saber si esta bien llamar a esta lista array bidimensional.

Código: Python
  1. 00125 | 01/10/2021 | Aceite Vicentin x 900 cc.       | $ 209.50
  2. 00315 | 10/06/2021 | Aomate Arco lata x 400 grs.     | $ 119.00
  3. 00025 | 13/05/2021 | Mayonesa RI-K doy pack x 250    | $ 109.50
  4. 00115 | 08/07/2021 | Pimientos morrones Arcor        | $ 152.00
  5. 00320 | 04/07/2021 | Pan el Kgr.                     | $ 180.00
  6. 00015 | 21/08/2021 | Aceitunas verdes fco. X 220     | $ 209.50
  7. 00825 | 19/06/2021 | Aceitunas negras fco. X 220     | $ 230.00
  8. 00601 | 03/10/2021 | Aceite Patito x 1500 cc.        | $ 359.50
  9. 00088 | 13/09/2021 | Azúcar Chango pte. X 1 kgr.     | $  99.90
  10. 00111 | 07/12/2021 | Ensalada de frutas lata x 850   | $ 193.00

Bueno, espero puedan ayudarme, gracias Daniel.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re:Ordenar una lista o array bidimensional.
« Respuesta #1 en: 21 de Diciembre de 2021, 02:14:26 »
Python tiene el método sort() incorporado en las listas y también la función sorted() que ayuda a ordenar un iterable, puedes revisar la documentación y ejemplos aquí:
https://docs.python.org/es/3/howto/sorting.html

Del ejemplo que colocas, cuando mencionas un array bidimensional, creo que con eso te refieres a que cada línea de tu ejemplo es una lista que tiene los elementos separados por "|", y que cada una de estas listas está dentro de otra más, es decir, que tu ejemplo está representado en código como una lista de listas. Siendo así, podrías ordenar por la columna que desees pasando el índice de dicha columna.

Por ejemplo, si la varaible registros es la lista de listas que menciono, para ordenar por la columna que da la descripción, podrías usar algo como esto:
Código: Python
  1. registros.sort(key=lambda registro: registro[2])

Algo a lo que tienes que poner atención es el tipo de dato con el que guardas cada columna, si todos son tipo string, es posible ordenar pero muy posiblemente los resultados no sean lo que esperas. P. ej., si ordenas por la columna fecha teniendo los datos de fecha como texto, el ordenamiento no será con base en la fecha sino con base al texto que está representando la fecha (01/10/2021 quedaría antes que 13/05/2021), para "resolver" esto podrías cambiar el formato de tu fecha a año/mes/día y seguir manteniéndolo como string, con esto al ordenar alfabéticamente también ordenaras por fecha, aunque también podrías almacenarlo como un tipo date.
« Última modificación: 21 de Diciembre de 2021, 02:16:58 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Ordenar una lista o array bidimensional.
« Respuesta #2 en: 21 de Diciembre de 2021, 07:20:36 »
Código: Python
  1. import re
  2.  
  3. datos = """00125 | 01/10/2021 | Aceite Vicentin x 900 cc.       | $ 209.50
  4. 00315 | 10/06/2021 | Tomate Arco lata x 400 grs.     | $ 119.00
  5. 00025 | 13/05/2021 | Mayonesa RI-K doy pack x 250    | $ 109.50
  6. 00115 | 08/07/2021 | Pimientos morrones Arcor        | $ 152.00
  7. 00320 | 04/07/2021 | Pan el Kgr.                     | $ 180.00
  8. 00015 | 21/08/2021 | Aceitunas verdes fco. X 220     | $ 209.50
  9. 00825 | 19/06/2021 | Aceitunas negras fco. X 220     | $ 230.00
  10. 00601 | 03/10/2021 | Aceite Patito x 1500 cc.        | $ 359.50
  11. 00088 | 13/09/2021 | Azúcar Chango pte. X 1 kgr.     | $  99.90
  12. 00111 | 07/12/2021 | Ensalada de frutas lata x 850   | $ 193.00"""
  13.  
  14. lista = re.split('\n', datos)
  15. array_2d = [re.split(' *\| *', linea) for linea in lista]  # Array bidimensional
  16.  
  17. def fecha(linea):
  18.     campos = re.split('/', linea[1])
  19.     return f"{campos[2]}{campos[1]}{campos[0]}"
  20.  
  21. array_2d.sort(key=fecha)
  22.  
  23. for linea in array_2d:
  24.     print(linea)
« Última modificación: 21 de Diciembre de 2021, 09:17:47 por Picuino »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Ordenar una lista o array bidimensional.
« Respuesta #3 en: 21 de Diciembre de 2021, 10:24:07 »
Geo, No puedo creer lo que me perjudico la diferencia horaria Argentina/España(creo suponer que vivís en España ¿no?),
te cuento, comencé a las 6 de la tarde y termine pasadas las 11.30 picando y picando código para lograr esto y vos con
una sola línea haces exactamente lo mismo, estoy consternado, jajajaja..
No voy a tirar todo a la basura voy a reemplazar el “sort” por código propio y lo voy a guardar como mi modulo de ordenamiento.-
Gracias geo por tu aporte fue de una invalorable ayuda.
Slds, Daniel.

Código: Python
  1. tmp = []
  2. final = []
  3.  
  4. for fila in encontrados:
  5.     uno = fila[2]
  6.     tmp.append(uno)
  7.  
  8. tmp.sort()
  9.  
  10. for fila in tmp:
  11.     for enc in encontrados:
  12.         if fila == enc[2]:
  13.             dos = enc
  14.             final.append(dos)    
  15.  
  16. for orden in final:
  17.     print(f"{orden[0]:05} - {orden[1]:10} - {orden[2]:30} - $ {orden[3]:8.2f}")

P. D. con respecto al tipo de dato son todos cadenas pues son sacados de un archivo,txt
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re:Ordenar una lista o array bidimensional.
« Respuesta #4 en: 21 de Diciembre de 2021, 15:07:20 »
Que bueno que te sirvió. Yo estoy en México :).

El código que puso picuino es un buen ejemplo de cómo usar una función adicional para el ordenamiento, usa formato añomesdía de la fecha pero solo en el proceso de ordenamiento y así no tienes que modificar el formato en la información que almacenas.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Ordenar una lista o array bidimensional.
« Respuesta #5 en: 21 de Diciembre de 2021, 16:21:53 »
Hola Picuino, me fue de mucha ayuda lo de la fecha, lo había visto en otro post tuyo pero no le di demasiada
importancia porque no me gusta la fecha en este formato “2021/12/21” pero ya me mentalice ese formato
para que lo entienda la compu y “21/12/2021” para mostrarla.-
Te cuento lo que me pasa ahora, siempre que extraje datos de un archivo lo hacia para mostrar, no era muy
difícil los imprimía en el momento o lo metía en una lista, pero ahora necesito dar un paso mas y poder lograr esto:

En el archivo .txt
00031, 15/05/2021, Tomate Arcor lata x 400 grs. , 101.50
00010, 20/10/2021, Extracto de tomate Molto , 79.50
00013, 05/05/2021, Mayonesa Helmmans DP x 250 grs. , 89.50
00061, 01/20/2021, Jabón en polvo Ala x 400 g. común , 79.50
00009, 10/11/2021, Extracto de tomate Arcor en lata , 82.50

¿Cómo hago esto?
Texto[0]  codigo
Texto[1]  fecha
Texto[3]  precio

Lo que ocurre es que en reiterados post me enseñaste muchas cosas pero como en este caso todo partía
desde una variable string ¿se entiende?.-
Si ambos me tienen un poco de paciencia tengo no menos de 10 preguntas para este tema pero no se
asusten que voy a ser paciente y comprensivo, jajajajaja los leo.-
PD. Probé con join pero se enoja y me dice que hay datos numéricos, no lo puedo lograr.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re:Ordenar una lista o array bidimensional.
« Respuesta #6 en: 22 de Diciembre de 2021, 00:22:05 »
¿Puedes describir un poco más a detalle qué es lo que intentas conseguir?

Considerando que en varios hilos he visto que publicas esa estructura de información, ¿considerarías usar mejor una base de datos para guardar esta información? Posiblemente te permita simplificar mucha tarea que quieres realizar con esos datos.

La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Ordenar una lista o array bidimensional.
« Respuesta #7 en: 22 de Diciembre de 2021, 11:13:00 »
Hola gente buen día ¿Cómo están?
Bueno he llegado a la conclusión que esto no da para mas, no me gusta estar en un foro
tan solo para exprimir el conocimiento de los demás para beneficio propio(egoísmo) y llegue
a esta conclusión porque estuve revisando los post de mi etapa anterior y Picuino eras todo
saludo y escribías bastante ahora es todo lo contrario.-
No desconozco que las personas pasamos por distintos estados de animo pero ya esto me
hace sentir que me puse un tanto “pesado” preguntando y preguntando y esto ultimo no me hace sentir nada bien.-
Lamento de sobremanera que esto ocurra porque ni en los mas populares aprendí tanto como en este.-
Gente linda de corazón les deseo lo mejor y con mas dificultades pero igual llegare a la meta, un fuerte fuerte abrazo…
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Ordenar una lista o array bidimensional.
« Respuesta #8 en: 22 de Diciembre de 2021, 14:40:30 »
No Daniel, no considero que te hayas puesto pesado, me gusta que preguntes.
A veces no tengo el tiempo necesario para explayarme, pero de todas formas me gusta responder a tus dudas.

Te preocupas porque buscas el beneficio propio, pero nosotros también obtenemos un beneficio explicando, que es aprender más y mejor sobre algo que sabemos y que nos gusta aprender.

Un saludo y mucho ánimo.
Ah y que no se me olvide, felices fiestas.



 

anything