TODOPIC

Lenguajes de programación para PC => Python => Mensaje iniciado por: Daniel1952 en 20 de Diciembre de 2021, 16:42:53

Título: Ordenar una lista o array bidimensional.
Publicado por: Daniel1952 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.
Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Geo 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.
Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Picuino 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)
Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Daniel1952 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
Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Geo 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.
Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Daniel1952 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.
Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Geo 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.

Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Daniel1952 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…
Título: Re:Ordenar una lista o array bidimensional.
Publicado por: Picuino 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.