Eliminación de duplicados - PERL
bibi
-
bheadman -
bheadman -
hola a todos,
quería su opinión sobre la mejor manera de proceder para eliminar duplicados de una lista de cadenas de caracteres...
lo que hago por ahora (no es genial y por eso publico ;)
1) las guardo en un arreglo simple (no asociativo)
push(@stock, $elem);
2) las ordeno
@stock=sort(@stock);
3) recorro todos los elementos y miro si el siguiente es identico. Si es identico, le asigno la valor ""
for ($i=0; $i < @stock; $i++)
{
if(@stock>$i+1)
{
($stock[$i]eq$stock[$i+1])?$stock[$i]='':$stock[$i];
}
}
4) hago otro intento (se lo había advertido... mi algoritmo no es genial) :(
@stock=sort(@stock);
5) luego, de nuevo, recorro la matriz eliminando los elementos cuando encuentro una cadena vacía... si encuentro algo diferente me voy...
while (@sender[0]eq'')
{
shift(@sender);
if (!@sender)
{
last;
}
}
... todo eso para quitar los duplicados.... :(
así que si alguien ve una forma más optimizada que la mía .... del estilo que me devuelva una función en perl eradikerdoublons() o (porque busqué, no existe esa súper función en perl ;) mejorar mi algoritmo ... sería genial que me expliquen cómo ;)
quería su opinión sobre la mejor manera de proceder para eliminar duplicados de una lista de cadenas de caracteres...
lo que hago por ahora (no es genial y por eso publico ;)
1) las guardo en un arreglo simple (no asociativo)
push(@stock, $elem);
2) las ordeno
@stock=sort(@stock);
3) recorro todos los elementos y miro si el siguiente es identico. Si es identico, le asigno la valor ""
for ($i=0; $i < @stock; $i++)
{
if(@stock>$i+1)
{
($stock[$i]eq$stock[$i+1])?$stock[$i]='':$stock[$i];
}
}
4) hago otro intento (se lo había advertido... mi algoritmo no es genial) :(
@stock=sort(@stock);
5) luego, de nuevo, recorro la matriz eliminando los elementos cuando encuentro una cadena vacía... si encuentro algo diferente me voy...
while (@sender[0]eq'')
{
shift(@sender);
if (!@sender)
{
last;
}
}
... todo eso para quitar los duplicados.... :(
así que si alguien ve una forma más optimizada que la mía .... del estilo que me devuelva una función en perl eradikerdoublons() o (porque busqué, no existe esa súper función en perl ;) mejorar mi algoritmo ... sería genial que me expliquen cómo ;)
6 respuestas
aquí una solución
my (%saw,@out)=();
undef %saw;
@out = sort(grep(!$saw{$_}++, @stock));
el arreglo @out posee la lista sin duplicados.
my (%saw,@out)=();
undef %saw;
@out = sort(grep(!$saw{$_}++, @stock));
el arreglo @out posee la lista sin duplicados.
He tenido la misma idea que sebsauvage, usar una tabla de HASH.
my %h_senders;
bucle sobre los elementos (condición) { # A ti te toca definirla
$h_senders[$elem]++;
}
Por cierto, te permite conocer el número de ocurrencias del elemento (gracias al incremento).
Así que si imprimes:
print $h_senders["je.suppose@que.cesont.des.email"];
Te mostrará cuántas veces se encuentra el email "je.suppose@que.cesont.des.email"
--
-= Bobinours - http://bobin.underlands.org =-
my %h_senders;
bucle sobre los elementos (condición) { # A ti te toca definirla
$h_senders[$elem]++;
}
Por cierto, te permite conocer el número de ocurrencias del elemento (gracias al incremento).
Así que si imprimes:
print $h_senders["je.suppose@que.cesont.des.email"];
Te mostrará cuántas veces se encuentra el email "je.suppose@que.cesont.des.email"
--
-= Bobinours - http://bobin.underlands.org =-
Espero que haya encontrado su solución desde hace tiempo ^^,
pero en resumen la idea (en Perl) es utilizar arrays de hash.
hay que introducir los valores deseados como claves y contar el número de ocurrencias de cada clave (el número de veces que aparece en la lista inicial). En Perl un array de hashes solo puede poseer un único valor de clave por array (no hay duplicados, en resumen) lo que resuelve el problema.
Voilá, creo que es lo que se propone en el último post (hace rato que no toco Perl) pero es por aquí por donde hay que buscar.
cordialmente.
Nicolas
pero en resumen la idea (en Perl) es utilizar arrays de hash.
hay que introducir los valores deseados como claves y contar el número de ocurrencias de cada clave (el número de veces que aparece en la lista inicial). En Perl un array de hashes solo puede poseer un único valor de clave por array (no hay duplicados, en resumen) lo que resuelve el problema.
Voilá, creo que es lo que se propone en el último post (hace rato que no toco Perl) pero es por aquí por donde hay que buscar.
cordialmente.
Nicolas
¡Hey!!!!
¿Aun así no me dirás que mi código está hiper optimizado???? ;-)
Si no conoces PERL, no importa, escríbeme en el lenguaje que mejor conozcas o en pseudocódigo para ver simplemente en francés lo que harías para mejorar mi código (me encargaré de transformarlo a PERL)
Espero tus sugerencias con impaciencia mci :)
¿Aun así no me dirás que mi código está hiper optimizado???? ;-)
Si no conoces PERL, no importa, escríbeme en el lenguaje que mejor conozcas o en pseudocódigo para ver simplemente en francés lo que harías para mejorar mi código (me encargaré de transformarlo a PERL)
Espero tus sugerencias con impaciencia mci :)
¿Y por qué no poner tus cadenas en una tabla de hash?
eso permite eliminar muy fácilmente los duplicados.
(Ya no recuerdo la sintaxis en Perl.)
eso permite eliminar muy fácilmente los duplicados.
(Ya no recuerdo la sintaxis en Perl.)
Para dar el ejemplo en Python, un programa que toma un archivo A.txt, elimina duplicados, ordena y escribe el resultado en B.txt (te lo pongo en versión compacta):
items = dict( [ (line,0) for line in open('A.txt','rb').read().split('\n')] ).keys()
items.sort()
open('B.txt','w+b').write('\n'.join(items))
¿No es bonito así, eh? ¿Tres pequeñas líneas de código?
(Bueno, de acuerdo, en cuanto a legibilidad no es terrible si no conoces Python :)
items = dict( [ (line,0) for line in open('A.txt','rb').read().split('\n')] ).keys()
items.sort()
open('B.txt','w+b').write('\n'.join(items))
¿No es bonito así, eh? ¿Tres pequeñas líneas de código?
(Bueno, de acuerdo, en cuanto a legibilidad no es terrible si no conoces Python :)