• Publicidad

Ordenar un hash por un valor y por la clave a la vez

Perl aplicado a la bioinformática

Ordenar un hash por un valor y por la clave a la vez

Notapor programando_perl » 2009-07-30 18:06 @796

Necesito ayuda... Tengo un hash en el que almaceno una clave y un valor y al imprimirlo se puede ver por pantalla:

Código: Seleccionar todo
#Codon                           AA
GCT                              A
GCA                              A
GCC                              A
TGT                              C
TGC                              C
ATA                              I
ATC                              I


y bueno, es mucho más amplio.. Se observa, por lo tanto, que el valor me aparece ordenado alfabéticamente (A, C, D, E, F..) pero necesito ADEMÁS (necesito ambos) que el codon también aparezca ordenado (dentro de los que codifican a un mismo aminoácido ordenados alfabéticamente).
Así pues, tendría que obtener

Código: Seleccionar todo
#Codon                          AA
GCA                             A
GCC                             A
GCT                             A
TGC                             C
TGT                             C
ATA                             I
ATC                             I



Observación: Dentro de los que codifican al aminoácido A, estarían ordenados alfabéticamente GCA, GCC,y GCT.

Escribidme el código por favor, que la función sort() me está desesperando.
Gracias.
Gracias de antemano.
Última edición por explorer el 2009-07-31 02:48 @158, editado 1 vez en total
Razón: Ortografía, bloques de código
programando_perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-07-30 17:50 @784

Publicidad

Re: Ordenar un hash por un valor y por la clave a la vez

Notapor explorer » 2009-07-31 02:56 @164

Bienvenido a los foros de Perl en español, programando_perl.

En efecto, se trata de ajustar un poco la función sort():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my %codon = (
    'GCT' => 'A',
    'GCA' => 'A',
    'GCC' => 'A',
    'TGT' => 'C',
    'TGC' => 'C',
    'ATA' => 'I',
    'ATC' => 'I',
);

for my $codon (sort { $codon{$a} cmp $codon{$b} || $a cmp $b } keys %codon) {
    print "$codon\t$codon{$codon}\n";
}

__END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

En la función sort(), primero ordenados alfabéticamente por los valores o (||), si éstos coinciden, ordenamos por las claves.

Esta es la forma de encadenar varios criterios de ordenación dentro de sort().
Más ejemplos en perldoc perlfunc sort().
Última edición por explorer el 2009-07-31 03:42 @196, editado 1 vez en total
Razón: Ortografía
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14475
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ordenar un hash por un valor y por la clave a la vez

Notapor programando_perl » 2009-07-31 03:38 @193

Muchísimas gracias. Funciona perfectamente :)
programando_perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-07-30 17:50 @784

Re: Ordenar un hash por un valor y por la clave a la vez

Notapor salva » 2009-07-31 05:07 @255

Hola,

Cuando quieras ordenar "cosas" por múltiples atributos otra alternativa es usar los módulos Sort::Maker o Sort::Key::Multi.

Yo personalmente (y de forma nada imparcial ;-) ) te recomiendo Sort::Key::Multi:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Sort::Key::Multi qw(ss_keysort);
  2.  
  3. my %codon = (...);
  4.  
  5. my @sorted_keys = ss_keysort { $codon{$_}, $_ } keys %codon;
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Las principales ventajas de usar estos módulos son por un lado la velocidad y por otro que el código queda más clarito, especialmente cuando las claves de ordenación se "calculan" al vuelo y son complicadas.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron