• Publicidad

Cómo saber el elemento más repetido de un array

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cómo saber el elemento más repetido de un array

Notapor anush » 2009-12-30 13:24 @600

¡¡Buenas!! Os voy a exponer mi problema:
Tengo un array de las siguientes caracteristicas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@array = ( 'AT','OH','GB','AT','AT','OH','TS')
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Quisiera saber cómo podríamos hacer una subrutina que nos devolviera el valor más repetido en este array, teniendo en cuenta que se podrían usar arrays con cientos de elementos.

Muchas gracias.
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Publicidad

Re: Como saber el elemento más repetido de un array

Notapor salva » 2009-12-30 13:54 @621

Con algo así...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# con un hash contamos cuántas veces aparece cada cadena:
my %count;
$count{$_}++ for @array;

# y luego buscamos en el hash la entrada que tiene la cuenta más alta:
my $key;
my $max = 0;
for (keys %count) {
  ($key, $max) = ($_, $count{$_})
    if $count{$_} > $max;
}

print "$key aparece $max veces\n"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Cómo saber el elemento más repetido de un array

Notapor anush » 2009-12-30 18:51 @827

Muchas gracias, pero ¿así tal cual? ¿En el guión qué pondría?
¿Tendría que crear un hash con un foreach() o así valdría?
Gracias de nuevo.
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: Cómo saber el elemento más repetido de un array

Notapor explorer » 2009-12-30 18:54 @829

Hummm... ¿has probado el código de Salva? :wink:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo saber el elemento más repetido de un array

Notapor anush » 2009-12-30 19:01 @834

Sí, sí, lo probaba pero había un error y no me funcionaba bien.

Ahora sí, mi pregunta es la siguiente: ¿la primera parte del código es una versión abreviada de un código que vi en tutoriales y demás que se hace con un foreach() y después un hash?
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: Cómo saber el elemento más repetido de un array

Notapor anush » 2009-12-30 19:10 @840

Me gustaría entender por qué en la primera parte del código se almacena en un hash la cantidad de veces que se repite cada valor, y cómo en la segunda parte se elige el de mayor número de veces. Gracias.
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: Cómo saber el elemento más repetido de un array

Notapor explorer » 2009-12-30 19:47 @866

Sí, el proceso de averiguar elementos comunes o cuántas veces aparecen es muy normal hacerlo con hash.

En el primer bucle se recorren todos los valores del array o lista de valores. Por cada uno, se actualiza (se incrementa en uno) el contador de veces que aparece. Naturalmente, la primera vez que aparece un valor, no existe su entrada en el hash, pero al hacer referencia a él, Perl lo crea, y al incrementarlo (mejor dicho, post-incrementarlo con ++) se toma su valor (que será 0(*) al principio) y lo incrementa en uno.

El resultado es que tenemos un hash, cuyas claves son los elementos únicos del array, y sus valores, las veces que aparecen.

En el segundo bucle, recorremos para todas las claves (keys) del hash. Por cada una, sacamos las veces que se repite. Si las veces que se repite supera el $max, nos quedamos con su cara (perdón, nombre).

Escrito de otra manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# con un hash contamos cuántas veces aparece cada cadena:
my %veces;
foreach my $elemento (@array) {
    $veces{$elemento}++;                             # El $elemento aparece una vez más
}

# y luego buscamos en el hash la entrada que tiene la cuenta más alta:
my $elemento_mas_repetido;
my $maximo_numero_veces = 0;
foreach my $elemento (keys %veces) {                 # Para todos los elementos únicos
    if ($veces{$elemento} > $maximo_numero_veces) {  # Si el $elemento supera el récord
        $elemento_mas_repetido = $elemento;              # nos quedamos con su nombre
        $maximo_numero_veces   = $veces{$elemento};      # anotamos el nuevo récord
    }
}

print "$elemento_mas_repetido aparece $maximo_numero_veces veces\n"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(*) En realidad, el valor no es 0, sino indefinido (undef), pero al hacer la operación matemática de post-incremento, el valor de indefinido lo transforma a 0
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo saber el elemento más repetido de un array

Notapor anush » 2009-12-31 07:15 @344

!Muchas gracias!
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: Cómo saber el elemento más repetido de un array

Notapor anush » 2009-12-31 08:12 @383

Gracias!
Última edición por anush el 2009-12-31 13:42 @612, editado 1 vez en total
anush
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2009-12-30 13:15 @594

Re: Cómo saber el elemento más repetido de un array

Notapor salva » 2009-12-31 08:28 @395

Si indentas bien el código, es fácil ver el error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $codon(keys %veces) {
      if ($veces{$codon}> $maximonumero) { #Si el numero de veces de este codon supera el maximo
         $codonfrecuente = $codon;         #Guardamos este codon
         $maximonumero = $veces{$codon};   #Ahora su numero de veces es el maximo
      }
      return $codonfrecuente; # <==== esto tiene que estar fuera del bucle
   }
                              # <==== ¡¡¡ aquí !!!
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron