Foros Python
Ordenar lista de listas.en python - Versión para impresión

+- Foros Python (https://foro.recursospython.com)
+-- Foro: Desarrollo (https://foro.recursospython.com/forumdisplay.php?fid=1)
+--- Foro: General (https://foro.recursospython.com/forumdisplay.php?fid=9)
+--- Tema: Ordenar lista de listas.en python (/showthread.php?tid=148)



Ordenar lista de listas.en python - Daniel.py - 11-04-2018

Hola, gente, ¿cómo están?
No estoy seguro de que el enunciado sea el correcto, ya veremos.
el caso es que no logro encontrar nada parecido en la web concerniente a lo que necesito hacer. -
Bueno dejo parte del código para que puedan orientarse:

Código:
def listado(cantidad):
   archivo = abrir_lectura()
   if archivo:
       while True:
           limpiar_pantalla()
           print(f'\n ========== Listado de traducciones ==========')

               while True:
                   try:
                       inicio = int(input(f'\n Ingrese código para INICIAR listado\n'
                                          f' mínimo 1 máximo {cantidad}..........:'))
                   except:
                       input('\n Debe ingresar un número entero\n\t'
                             'Pulse [Enter] para continuar...')
                   else:
                       break

               if inicio < 1 or inicio > cantidad:
                   input(f'\n Por favor preste atención a los limites\n'
                         f' mínimo 1 máximo {cantidad}\n\t'
                          'Pulse [Enter] para continuar...')
               else:
                   break

           while True:
               while True:
                   try:
                       final = int(input(f'\n Ingrese código para FINALIZAR listado\n'
                                         f' mínimo {inicio} máximo {cantidad}..........:'))
                   except:
                       input('\n Debe ingresar un número entero\n\t'
                             'Pulse [Enter] para continuar...')
                   else:
                       break

               if final < inicio or final > cantidad:
                   input(f'\n Por favor preste atención a los limites\n'
                         f' mínimo {inicio} máximo {cantidad}\n\t'
                          'Pulse [Enter] para continuar...')
               else:
                   break


           resultado = []
           for linea in archivo:
               tmp = linea.split(sep=',')
               if int(tmp[0]) >= inicio and int(tmp[0]) <= final:
                   resultado.append(linea)

           mostrar(resultado)
           archivo.close()
           input('\n Pulse [Enter] para continuar...')
           limpiar_pantalla()
   else:
       input("\n No se pudo abrir el archivo...\n"
             " Pulse [Enter] para finalizar...")

Código:
def mostrar(_resultado):
    _ancho_cpo_uno,ancho_cpo_uno = 0,0
    cabecera = ['Código', 'Inglés', 'Español' ]
    for linea in _resultado:
        resultado = linea.split(sep=',')
        _ancho_cpo_uno = len(resultado[1])
        if _ancho_cpo_uno > ancho_cpo_uno:
            ancho_cpo_uno = _ancho_cpo_uno

    print('\n --------------------------------')
    print(f'\n{cabecera[0]:>7}',f' {cabecera[1]:<{ancho_cpo_uno}} ',f'{cabecera[2]:<27}')
    for linea in _resultado:
        linea = linea.replace('\n', '')
        encontrados = linea.split(sep=',')
        print(f'{encontrados[0]:>7}',f' {encontrados[1]:{ancho_cpo_uno}} ',f'{encontrados[2]:<27}')
    print('\n --------------------------------')
    ordenar(_resultado)

Código:
def ordenar(resultado):
    while True:
        print('\n ========== Menú ordenar ==========')
        opc = input('\n 1 - Código\n 2 - Inglés\n 3 - Español\n 4 - Regresar\n '
                         '\n Ingrese opción...:')
        if opc >= '1' and opc <= '4':
            if opc == '4':
                break
        else:
                input(f'\n Ingrese opción entre "1" y "4"...'
                         '\n\t Pulse [Enter] para continuar...')

for linea in resultado:
    separar = linea.split(sep=',')
    print(f'{separar[0]}  {separar[1]}  {separar[2]}')

Espero se entienda.
Saludos.


RE: Ordenar lista de listas.en python - calvicius - 12-04-2018

hola,
Hay varios sistemas de ordenación de elementos en memoria: burbuja, mezcla etc...
Estos métodos se aplican a cualquier lenguaje de programación.
Aqui tienes una página que explican los diversos métodos de ordenación en Python:

http://interactivepython.org/runestone/static/pythoned/SortSearch/toctree.html


RE: Ordenar lista de listas.en python - Daniel.py - 13-04-2018

Hola, buen día.
Uffffff bueno al fin pude lograrlo, desconozco cuánto se podrá optimizar, pero igual estoy contento por haberlo logrado.
Me atrevo a pedirles una ayudita más, en este bucle quisiera ahorrar una lista ya que con append o insert lo lograría pero me queda en un bucle infinito, ¿me podrían decir como hacerlo?. -


Código:
for linea in archivo:
    tmp = linea.split(sep=',')
    ordenado.append(tmp[1])    # 001
    tmp_ordenado.append(tmp) # 002

El programa completo:


Código:
def ordenar():
    archivo = open("traductor.txt", "r")
    ordenado = []                                               # 001
    tmp_ordenado = []                                        # 002
    ordenado_final = []                                        # 003

    for linea in archivo:
        tmp = linea.split(sep=',')
        ordenado.append(tmp[1])                           # 001
        tmp_ordenado.append(tmp)                        # 002

    ordenado.sort() # 004

    for linea in ordenado:                                     # 005
        for tmp_linea in tmp_ordenado:                   # 006
            if linea == tmp_linea[1]:                         # 007
            ordenado_final.append(tmp_linea)            # 008

    archivo.close()

    return ordenado_final                                     # 009


def mostrar(resultado):
    _ancho_cpo_uno,ancho_cpo_uno = 0,0            # 010
    cabecera = ['Código', 'Inglés', 'Español' ]

    for linea in resultado:
        _ancho_cpo_uno = len(linea[1])
        if _ancho_cpo_uno > ancho_cpo_uno:
            ancho_cpo_uno = _ancho_cpo_uno          # 011

    print('\n --------------------------------')
    print(f'\n{cabecera[0]:>7}',f' {cabecera[1]:<{ancho_cpo_uno}} ',f'{cabecera[2]:<27}')
    for linea in resultado:                                      # 012
        print(f'{linea[0]:>7}',f' {linea[1]:{ancho_cpo_uno}} ',f'{linea[2]:<27}')
        print('\n --------------------------------')


ordenado = ordenar()
mostrar(ordenado)

'''
======================== Ayuda para programador ========================
En el archivo: 1,Home,Casa hogar domicilio

001 - Lista para archivar sólamente el campo a ordenar ==> "Home"
002 - Lista para archivar línea a línea el contenido del archivo
  ==> "1 Home Casa hogar domicilio"
003 - Lista para archivar los tres campos ya ordenados
  ==> "104 Add   Añadir Agregar Sumar"
  ==> " 74 After Despues de Detras"
004 - Ordena la lista con un único elemento(a ordenar) ==> "Home"   
005 - Bucle para recorrer la lista "ordenado"
006 - Bucle para recorrer la lista "tmp_ordenado"  
007 - Recorre la lista "ordenado" y en el segundo "for" busca hasta
  encontrar el texto por ej. "Add" en el momento que lo encuentra
  (008) lo archiva en la lista "ordenado_final"  
008 - Ej. de lo que se agrega a la lista "ordenado_final"
  ==> "104 Add   Añadir Agregar Sumar"
  ==> " 74 After Despues de Detras"
009 - Retornamos la lista ya ordenada. 
010 - Variables para almacenar la palabra mas ancha del campo "Inglés" 
011 - Con este bucle se obtiene la palabra más ancha.-  
011 - Y con este bucle se imprime la lista ordenada con la cabecera y
  los campos perfectamente alineados.
========================================================================
'''
Calvicius, muy pero muy interesante la pág. que me sugeriste, gracias.-
Saludos.


RE: Ordenar lista de listas.en python - Daniel.py - 14-04-2018

Hola, que tengan un muy buen día.
El código que dejo a continuación es lo que realmente quería lograr, evidentemente, no me supe explicar porque de otra manera Uds. me lo hubieran sugerido,además me pase horas y horas buscando como ordenar listas y pude encontrar una sola página de la cual obtuve el ejemplo. -
Ahora me quedan 2 cosas por resolver y voy a pedirles nuevamente ayuda:


Código:
traductorOb.sort(key=lambda Traductor: Traductor.codigo)
Necesito hacer un menú para que el operador elija como quiere que se muestren los datos: ordenados por código, inglés o español o sea poner en una variable cualquiera de las 3 opciones y enviarla a la clase pero no lo logro.
En el próximo post expongo el otro problema a resolver. Big Grin


Código:
class Traductor:

    def __init__(self, codigo, ingles, espaniol):
        self.codigo = codigo
        self.ingles = ingles
        self.espaniol = espaniol

    def __str__(self):
        return "%i - %s - %s" % (self.codigo, self.ingles, self.espaniol)

archivo = open("traductor.txt", "r")
traductorOb = []
for linea in archivo:
    tmp = linea.split(sep=',')
    _tmp = tmp[2].replace("\n", "").replace("\r", "")
    traductorOb.append(Traductor(int(tmp[0]), tmp[1], _tmp))

traductorOb.sort(key=lambda Traductor: Traductor.espaniol)
archivo.close()
print('\n')
for linea in traductorOb:
    print(linea)

Saludos.


RE: Ordenar lista de listas.en python - Daniel.py - 15-04-2018

Bueno esto si funciona y es definitivamente lo que quería lograr.


Código:
def open_file():
   try:
       archivo = open("traductor.txt", "r")
   except:
       input('\n No se pudo abrir el archivo'
             '\n\t Pulse [Enter] para finalizar...')
   return archivo

def add_list(archivo):
   translator = []
   for linea in archivo:
       _enc = linea.replace("\n", "").replace("\r", "")
       enc = _enc.split(sep=',')
       translator.append((int(enc[0]),enc[1],enc[2]))

   archivo.close()
   return translator 

def menu():
   while True:
       opc = input('\n ===== Menú ordenar =====\n\n'
                   ' 1 - codigo \n 2 - inglés\n 3 - español'
                   '\n\n Ingrese opción...: ')
       if opc <= '0' or  opc >= '4':
           input('\n El ingreso debe ser entre 1 y 3 '
                 '\n\t Pulse [Enter] para intentarlo nuevamente...')
       else:
           break
   return opc

def _sort(lista, opc):
   _opc = int(opc)
   _opc -= 1
   ordenadas = sorted(lista , key = lambda est : est[ _opc ])

   return ordenadas

def mostrar(ordenada):
   _ancho_cpo_uno,ancho_cpo_uno = 0,0
   cabecera = ['Código', 'Inglés', 'Español' ]
   for linea in ordenada:
       resultado = linea[1]
       _ancho_cpo_uno = len(resultado)
       if _ancho_cpo_uno > ancho_cpo_uno:
           ancho_cpo_uno = _ancho_cpo_uno

   print('\n --------------------------------')
   print(f'\n{cabecera[0]:>7}',f' {cabecera[1]:<{ancho_cpo_uno}} ',f'{cabecera[2]:<27}')
   for linea in ordenada:
       print(f'{linea[0]:>7}',f' {linea[1]:{ancho_cpo_uno}} ',f' {linea[2]:<27}')
       print('\n --------------------------------')

archivo = open_file()
if archivo:
    lista = add_list(archivo)
    opc = menu()
    ordenada = _sort(lista, opc)
    mostrar(ordenada)

Daniel