Foros Python

Versión completa: Ordenar lista de listas.en python
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
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.
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/s...ctree.html
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.
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.
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