Abril 21, 2018, 10:37:37 pm

Autor Tema: python - ordenar lista de listas.  (Leído 904 veces)

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

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 37
  • Sexo: Masculino
    • Ver Perfil
python - ordenar lista de listas.
« en: Abril 11, 2018, 06:37:32 pm »
Hola gente, ¿como están? no estoy seguro 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: You are not allowed to view links. Register or Login
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: You are not allowed to view links. Register or Login
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: You are not allowed to view links. Register or Login
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]}')

Parte del archivo .txt

Citar
1,Home,Casa hogar domicilio
2,Chair,Silla
3,Moon,Luna
4,Sun,Sol
5,Night,Noche
6,Self,Yo Uno mismo
7,Table,Mesa
8,Knife,Cuchillo
9,Spoon,Cuchara
10,Fork,Tenedor
11,While,Mientras que
12,Gathers,Reune Reunir
13,Could,Podria
14,Put,Poner
15,Place,Lugar
16,Square,Plaza Lugar publico
17,They,Ellos Ellas
18,Right,Derecho Tener razon


Espero puedan ayudarme, me interesa este tema de sobremanera.-
Saludos.
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 seth

  • El mas real
  • G#
  • **
  • Mensajes: 7923
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #1 en: Abril 12, 2018, 04:57:29 pm »
Como las queres ordenar? alfabeticamente segun la columna que elijan?

Esto deberia servir You are not allowed to view links. Register or Login


Ves links a xd-blog.com.ar que no andan? buscalos en You are not allowed to view links. Register or Login

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 37
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #2 en: Abril 12, 2018, 05:03:06 pm »
Citar
Como las queres ordenar? alfabeticamente segun la columna que elijan?
Hola, es eso precisamente lo que quiero lograr, por el momento lo estoy haciendo a mi manera, no me va mal, pero me cuesta un tanto.
Saludos.

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 37
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #3 en: Abril 13, 2018, 08:52:54 am »
Hola, buen día.
Uffffff bueno al fin pude lograrlo, desconozco cuánto se podrá optimizar, pero igual estoy contento por haberlo logrado.

Código: You are not allowed to view links. Register or Login
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.
=====================================================================
'''
Saludos.
Daniel

Desconectado seth

  • El mas real
  • G#
  • **
  • Mensajes: 7923
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #4 en: Abril 13, 2018, 02:54:13 pm »
Se puede optimizar bastante. Tratá de contar cuantas veces lees y escribis cada dato, incluyendo adentro de .sort()

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 37
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #5 en: Abril 13, 2018, 03:35:14 pm »
No sé ni por donde empezar con lo que me decís, pero lo voy a intentar y perdón por ser pre juicioso pero seguramente te voy a pedir alguna orientación. -
Saludos.

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 37
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #6 en: Abril 14, 2018, 01:41:35 pm »
Hola.
El código que dejo a continuación es exactamente lo que quería lograr, créanme que pase horas buscando en la web y encontré tan solo una página (en español) de donde obtuve el ejemplo, la única pena es que contiene clases (POO) que todavía no llegue a estudiar. -

Código: You are not allowed to view links. Register or Login
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)
Ahora les voy a pedir una ayuda más, quiero hacer un menú para que se pueda elegir por cual de los 3 campos mostrar los datos ordenados pero no lo logro, esta es la línea a modificar según la elección. -
traductorOb.sort(key=lambda Traductor: Traductor.espaniol)

Un abrazo.

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 37
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #7 en: Abril 14, 2018, 08:10:15 pm »
Bueno esto si funciona y es definitivamente lo que quería lograr.

Código: You are not allowed to view links. Register or Login
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

Desconectado seth

  • El mas real
  • G#
  • **
  • Mensajes: 7923
  • Sexo: Masculino
    • Ver Perfil
Re: python - ordenar lista de listas.
« Respuesta #8 en: Abril 16, 2018, 03:33:59 pm »
Armá un set de datos chico y segui el codigo metalmente anotando cuantas veces lee y cuantas escribe variables. Podes dejar afuera la parte en que llamas a sort() al principio y despues googlear como funciona.
Muchas veces eso cambia segun los datos que elijas, si ya vienen ordenados es posible que tengas que realizar menos operaciones. Normalmente lo que se busca evaluar es el peor caso y el promedio

La idea es que te des cuenta de que estas haciendo operaciones de mas comparado con un algoritmo mas optimo, pero si lo comprobas en lugar de creerme seguro vas a aprender mas


 La solucion con lambda estaba en la segunda respuesta del post de stackoverflow que te puse arriba. Te recomiendo que trates de leer stackoverflow aunque se te complique el ingles, suelen tener buenas soluciones


question
Funcion para ordenar la lista

Iniciado por esc0rpi0n_zer0

8 Respuestas
1532 Vistas
Último mensaje Noviembre 26, 2010, 01:15:45 pm
por josepil
xx
[Error] Ordenar lista enlazada por punteros. Erorr segmentation fault

Iniciado por Rul0

3 Respuestas
1588 Vistas
Último mensaje Noviembre 27, 2013, 02:13:59 pm
por mDrinky
exclamation
Lista de Retos & Desafios Python [Leer aquí]

Iniciado por Sthefano02

0 Respuestas
9502 Vistas
Último mensaje Noviembre 14, 2010, 10:09:58 am
por Sthefano02
thumbup
Dudas con parámetros(mutables/lista) en función con python.

Iniciado por YoSoyRDV

4 Respuestas
1239 Vistas
Último mensaje Marzo 21, 2018, 04:52:13 am
por Solid Water
exclamation
[Código-Python]Eliminar Repeticiones en Lista - JaAViEr

Iniciado por JaAViEr

3 Respuestas
3225 Vistas
Último mensaje Mayo 19, 2011, 08:21:03 pm
por .:WindHack:.®
question
ordenarr alfabeticamente la lista de un listbox(cuadro de lista) ??????

Iniciado por cesitar1702

1 Respuestas
2015 Vistas
Último mensaje Junio 03, 2007, 04:26:19 pm
por Ther0x
xx
Listas [[Vb.NET]]

Iniciado por .:.IlcOn14.:.

0 Respuestas
2418 Vistas
Último mensaje Enero 28, 2010, 12:56:28 am
por .:.IlcOn14.:.
question
Listas con apuntadores en C++

Iniciado por Rcart

1 Respuestas
2641 Vistas
Último mensaje Agosto 02, 2009, 04:42:03 pm
por .xAk.
xx
Listas enlazadas / Dev c++

Iniciado por Zoldier_X

6 Respuestas
5973 Vistas
Último mensaje Julio 31, 2008, 10:41:41 pm
por Zoldier_X
question
interseccion de listas

Iniciado por diablokira

15 Respuestas
6031 Vistas
Último mensaje Marzo 17, 2010, 06:46:59 am
por Piromaniaco