Eu tenho uma matriz em Perl:
my @my_array = ("one","two","three","two","three");
Como faço para remover as duplicatas da matriz?
perl
arrays
unique
duplicates
David
fonte
fonte
my
léxico neste escopo, então tudo bem. Dito isto, possivelmente um nome de variável mais descritivo poderia ser escolhido.$::a
e$::b
não seria?sub uniq { my %seen; grep !$seen{$_}++, @_ }
é uma implementação melhor, pois preserva a ordem sem nenhum custo. Ou melhor ainda, use o da List :: MoreUtils.A documentação do Perl vem com uma boa coleção de perguntas frequentes. Sua pergunta é freqüente:
A resposta, copie e cole a partir da saída do comando acima, aparece abaixo:
fonte
Lista de instalação :: MoreUtils from CPAN
Então no seu código:
fonte
@dup_list
deve estar dentro dauniq
chamada, não@dups
Minha maneira usual de fazer isso é:
Se você usar um hash e adicionar os itens ao hash. Você também tem o bônus de saber quantas vezes cada item aparece na lista.
fonte
foreach
loop:@unique{@myarray}=()
A variável @array é a lista com elementos duplicados
fonte
Pode ser feito com um liner Perl simples.
O bloco PFM faz isso:
Os dados em @in são alimentados no MAP. O MAP cria um hash anônimo. As chaves são extraídas do hash e alimentam @out
fonte
Esse último foi muito bom. Eu apenas ajustaria um pouco:
Eu acho que essa é provavelmente a maneira mais legível de fazer isso.
fonte
Método 1: usar um hash
Lógica: um hash pode ter apenas chaves exclusivas; portanto, itere sobre a matriz, atribua qualquer valor a cada elemento da matriz, mantendo o elemento como chave desse hash. Retorne as chaves do hash, é sua matriz exclusiva.
Método 2: Extensão do método 1 para reutilização
Melhor criar uma sub-rotina se devemos usar essa funcionalidade várias vezes em nosso código.
Método 3: usar o módulo
List::MoreUtils
fonte
As respostas anteriores resumem bastante as maneiras possíveis de realizar essa tarefa.
No entanto, sugiro uma modificação para aqueles que não se preocupam contando os duplicados, mas fazer o cuidado sobre a ordem.
Observe que os
grep !$seen{$_}++ ...
incrementos sugeridos anteriormente$seen{$_}
antes de negar, portanto, o incremento ocorre independentemente de já ter sido%seen
ou não. O exposto acima, no entanto, provoca um curto-circuito quando$record{$_}
é verdade, deixando o que foi ouvido uma vez "fora do ar%record
".Você também pode usar esse ridículo, que tira proveito da autovivificação e da existência de chaves de hash:
Isso, no entanto, pode levar a alguma confusão.
E se você não se importa com pedidos ou contagens duplicadas, pode fazer outro hack usando fatias de hash e o truque que acabei de mencionar:
fonte
sub uniq{ my %seen; undef @seen{@_}; keys %seen; }
Neat.Tente isso, parece que a função uniq precisa de uma lista classificada para funcionar corretamente.
fonte
Usando o conceito de chaves de hash exclusivas:
Saída: acbd
fonte