Página 1 de 1

Invertir un hash

NotaPublicado: 2009-11-06 15:38 @693
por lopezperl
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.

Re: Invertir un hash

NotaPublicado: 2009-11-06 17:28 @769
por explorer
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

Re: Invertir un hash

NotaPublicado: 2009-11-07 05:06 @254
por lopezperl
¡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!

Re: Invertir un hash

NotaPublicado: 2009-11-07 05:55 @288
por explorer
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.

Re: Invertir un hash

NotaPublicado: 2009-11-08 11:40 @528
por lopezperl
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.

Re: Invertir un hash

NotaPublicado: 2009-11-08 11:54 @537
por explorer
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).

Re: Invertir un hash

NotaPublicado: 2009-11-09 06:43 @321
por lopezperl
Vale, ya entiendo.

Mil gracias, ¡un saludo!