• Publicidad

Invertir un hash

Perl aplicado a la bioinformática

Invertir un hash

Notapor lopezperl » 2009-11-06 15:38 @693

Hola a todos.

Quería haceros una pregunta breve: ¿hay alguna forma de, teniendo un hash, convertir sus valores en claves y sus claves en valores?

Muchas gracias.
lopezperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-11-05 13:08 @589

Publicidad

Re: Invertir un hash

Notapor explorer » 2009-11-06 17:28 @769

Pues a pregunta breve, respuesta breve: con la función reverse().

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
%por_nombre = reverse %por_direccion;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Invertir un hash

Notapor lopezperl » 2009-11-07 05:06 @254

¡Muchas gracias! Ya de paso, otra preguntilla.
Yo tengo un hash en el que varias claves dan lugar al mismo valor (como en el caso del hash con los codones); si invierto el hash, tendré varias claves iguales que darán lugar a distintos valores. Sin embargo, cuando intento buscar una clave repetida para que me devuelva sus valores correspondientes, en lugar de devolverme los distintos valores, me devuelve únicamente un valor. ¿Hay alguna manera de que me devuelva todos los valores?

¡Gracias otra vez!
lopezperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-11-05 13:08 @589

Re: Invertir un hash

Notapor explorer » 2009-11-07 05:55 @288

Como se indica en la página de manual de reverse(), que te enlacé, los valores, al ser pasados a claves, son eliminados los que sean duplicados. O mejor dicho: solo queda en el nuevo diccionario las últimas claves que sean únicas.

El caso que pones, no te vale con hacer una inversión del diccionario.

Lo mejor será que construyas el diccionario mirando todas las claves y almacenándoles en otra forma, como nuevos valores. Es decir: deseas que, dado un aminoácido, obtener qué codones lo codifican. La cuestión ahora es saber cómo meter varios codones en un valor de diccionario.

Una solución sería meterlos en un arreglo. Así, tendremos un diccionario de arreglos.

Con el siguiente programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. # Diccionario  aminoácido <- codones
  7. my (%aminoacido_del_codon) = (
  8.     'TCA' => 'S',    # Serina
  9.     'TCC' => 'S',    # Serina
  10.     'TCG' => 'S',    # Serina
  11.     'TCT' => 'S',    # Serina
  12.     'TTC' => 'F',    # Fenilalanina
  13.     'TTT' => 'F',    # Fenilalanina
  14.     'TTA' => 'L',    # Leucina
  15.     'TTG' => 'L',    # Leucina
  16.     'TAC' => 'Y',    # Tirosina
  17.     'TAT' => 'Y',    # Tirosina
  18.     'TAA' => '_',    # Stop
  19.     'TAG' => '_',    # Stop
  20.     'TGC' => 'C',    # Cisteina
  21.     'TGT' => 'C',    # Cisteina
  22.     'TGA' => '_',    # Stop
  23.     'TGG' => 'W',    # Triptófano
  24.     'CTA' => 'L',    # Leucina
  25.     'CTC' => 'L',    # Leucina
  26.     'CTG' => 'L',    # Leucina
  27.     'CTT' => 'L',    # Leucina
  28.     'CCA' => 'P',    # Prolina
  29.     'CCC' => 'P',    # Prolina
  30.     'CCG' => 'P',    # Prolina
  31.     'CCT' => 'P',    # Prolina
  32.     'CAC' => 'H',    # Histidina
  33.     'CAT' => 'H',    # Histidina
  34.     'CAA' => 'Q',    # Glutamina
  35.     'CAG' => 'Q',    # Glutamina
  36.     'CGA' => 'R',    # Arginina
  37.     'CGC' => 'R',    # Arginina
  38.     'CGG' => 'R',    # Arginina
  39.     'CGT' => 'R',    # Arginina
  40.     'ATA' => 'I',    # Isoleucina
  41.     'ATC' => 'I',    # Isoleucina
  42.     'ATT' => 'I',    # Isoleucina
  43.     'ATG' => 'M',    # Metionina
  44.     'ACA' => 'T',    # Treonina
  45.     'ACC' => 'T',    # Treonina
  46.     'ACG' => 'T',    # Treonina
  47.     'ACT' => 'T',    # Treonina
  48.     'AAC' => 'N',    # Asparagina
  49.     'AAT' => 'N',    # Asparagina
  50.     'AAA' => 'K',    # Lisina
  51.     'AAG' => 'K',    # Lisina
  52.     'AGC' => 'S',    # Serina
  53.     'AGT' => 'S',    # Serina
  54.     'AGA' => 'R',    # Arginina
  55.     'AGG' => 'R',    # Arginina
  56.     'GTA' => 'V',    # Valina
  57.     'GTC' => 'V',    # Valina
  58.     'GTG' => 'V',    # Valina
  59.     'GTT' => 'V',    # Valina
  60.     'GCA' => 'A',    # Alanina
  61.     'GCC' => 'A',    # Alanina
  62.     'GCG' => 'A',    # Alanina
  63.     'GCT' => 'A',    # Alanina
  64.     'GAC' => 'D',    # Ácido aspártico
  65.     'GAT' => 'D',    # Ácido aspártico
  66.     'GAA' => 'E',    # Ácido glutámico
  67.     'GAG' => 'E',    # Ácido glutámico
  68.     'GGA' => 'G',    # Glicina
  69.     'GGC' => 'G',    # Glicina
  70.     'GGG' => 'G',    # Glicina
  71.     'GGT' => 'G',    # Glicina
  72. );
  73.  
  74. # Creación del diccionario  codones <- aminoácido
  75. my %codones_del_aminoacido;
  76.  
  77. foreach my $codon (keys %aminoacido_del_codon) {
  78.  
  79.     push @{$codones_del_aminoacido{$aminoacido_del_codon{$codon}}}, $codon;
  80. }
  81.  
  82. use Data::Dumper;
  83. print Dumper \%aminoacido_del_codon, \%codones_del_aminoacido;
  84.  
  85. __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


la salida es

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> ./code_19585.pl
$VAR1 = {
          'GCC' => 'A',
          'AGT' => 'S',
          'TGA' => '_',
          'TGT' => 'C',
          'CGA' => 'R',
          'ATC' => 'I',
          'AAC' => 'N',
          'AGC' => 'S',
          'TAC' => 'Y',
          'ACA' => 'T',
          'TCG' => 'S',
          'CCG' => 'P',
          'CTG' => 'L',
          'GCA' => 'A',
          'GTG' => 'V',
          'AAG' => 'K',
          'GTT' => 'V',
          'CAC' => 'H',
          'AGA' => 'R',
          'ACC' => 'T',
          'CCA' => 'P',
          'TGG' => 'W',
          'CTC' => 'L',
          'CGC' => 'R',
          'TTG' => 'L',
          'TAA' => '_',
          'CAG' => 'Q',
          'ACG' => 'T',
          'AAA' => 'K',
          'ATG' => 'M',
          'GTA' => 'V',
          'TAG' => '_',
          'CTT' => 'L',
          'GGA' => 'G',
          'GTC' => 'V',
          'TGC' => 'C',
          'TCA' => 'S',
          'ATT' => 'I',
          'TAT' => 'Y',
          'AAT' => 'N',
          'ACT' => 'T',
          'CAA' => 'Q',
          'GAC' => 'D',
          'GGT' => 'G',
          'TCC' => 'S',
          'TTT' => 'F',
          'AGG' => 'R',
          'CGT' => 'R',
          'ATA' => 'I',
          'CGG' => 'R',
          'CAT' => 'H',
          'CCC' => 'P',
          'GGG' => 'G',
          'TTA' => 'L',
          'GAG' => 'E',
          'CTA' => 'L',
          'GAT' => 'D',
          'TCT' => 'S',
          'TTC' => 'F',
          'GCG' => 'A',
          'GGC' => 'G',
          'GCT' => 'A',
          'GAA' => 'E',
          'CCT' => 'P'
        };
$VAR2 = {
          'F' => [
                   'TTT',
                   'TTC'
                 ],
          'S' => [
                   'AGT',
                   'AGC',
                   'TCG',
                   'TCA',
                   'TCC',
                   'TCT'
                 ],
          'T' => [
                   'ACA',
                   'ACC',
                   'ACG',
                   'ACT'
                 ],
          'N' => [
                   'AAC',
                   'AAT'
                 ],
          'K' => [
                   'AAG',
                   'AAA'
                 ],
          'E' => [
                   'GAG',
                   'GAA'
                 ],
          'Y' => [
                   'TAC',
                   'TAT'
                 ],
          'V' => [
                   'GTG',
                   'GTT',
                   'GTA',
                   'GTC'
                 ],
          'Q' => [
                   'CAG',
                   'CAA'
                 ],
          'M' => [
                   'ATG'
                 ],
          'C' => [
                   'TGT',
                   'TGC'
                 ],
          'L' => [
                   'CTG',
                   'CTC',
                   'TTG',
                   'CTT',
                   'TTA',
                   'CTA'
                 ],
          'A' => [
                   'GCC',
                   'GCA',
                   'GCG',
                   'GCT'
                 ],
          'W' => [
                   'TGG'
                 ],
          'P' => [
                   'CCG',
                   'CCA',
                   'CCC',
                   'CCT'
                 ],
          '_' => [
                   'TGA',
                   'TAA',
                   'TAG'
                 ],
          'H' => [
                   'CAC',
                   'CAT'
                 ],
          'D' => [
                   'GAC',
                   'GAT'
                 ],
          'I' => [
                   'ATC',
                   'ATT',
                   'ATA'
                 ],
          'R' => [
                   'CGA',
                   'AGA',
                   'CGC',
                   'AGG',
                   'CGT',
                   'CGG'
                 ],
          'G' => [
                   'GGA',
                   'GGT',
                   'GGG',
                   'GGC'
                 ]
        };
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Fíjate que ahora tenemos agrupados todos los codones correspondientes a cada aminoácido. Ahora podemos sacar información de esta estructura de datos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "Codones del aminoácido 'R': ", join(" ", @{$codones_del_aminoacido{R}}), "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Codones del aminoácido 'R': CGA AGA CGC AGG CGT CGG
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La sintaxis se puede enrevesar un poco para el neófito, pero es fácil si se mira poco a poco:
$codones_del_aminoacido{R} : estamos accediendo al valor correspondiente a la clave 'R' dentro del diccionario %codones_del_aminoacido. Ese valor sabemos que es siempre un arreglo, por lo que podemos acceder a los elementos de ese arreglo con '@': @{$codones_del_aminoacido{R}}.

Podríamos incluso acceder a solo el primer codón: @{$codones_del_aminoacido{R}}[0], $codones_del_aminoacido{R}->[0] o $codones_del_aminoacido{R}[0]. La salida es siempre la misma: 'CGA'.

Recomendable la lectura de perldoc perldsc, sección HASHES-OF-ARRAYS.
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Invertir un hash

Notapor lopezperl » 2009-11-08 11:40 @528

Hola


Muchísimas gracias otra vez. Acabo de mirarlo y en general entiendo el procedimiento, salvo lo referente a las dos últimas líneas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Data::Dumper;
  2. print Dumper \%aminoacido_del_codon, \%codones_del_aminoacido;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Para qué sirve lo de "use Data::Dumper"?

Mil gracias.
lopezperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-11-05 13:08 @589

Re: Invertir un hash

Notapor explorer » 2009-11-08 11:54 @537

Data::Dumper es un módulo que viene incluido de base en todas las distribuciones Perl.

Sirve, entre otras cosas, para hacer un volcado del contenido de las variables. Así podemos saber con qué estamos trabajando y si lo estamos haciendo bien.

En la segunda línea hacemos uso de la función Dumper() que hemos exportado desde Data::Dumper, y le pasamos como argumento la referencia ('\') a los dos diccionarios, para que nos los despliegue en pantalla (y que yo te he copiado en mi mensaje).
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Invertir un hash

Notapor lopezperl » 2009-11-09 06:43 @321

Vale, ya entiendo.

Mil gracias, ¡un saludo!
lopezperl
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-11-05 13:08 @589


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados