Sem iterar sobre toda a matriz, como posso verificar se x
na matriz usando Go? A linguagem tem uma construção?
Como Python: if "x" in array: ...
Sem iterar sobre toda a matriz, como posso verificar se x
na matriz usando Go? A linguagem tem uma construção?
Como Python: if "x" in array: ...
strings.Index
) ajuda a tornar mais óbvio o que o código está fazendo. Tenho a impressão de que talvez você ache que o Pythonin array:
está fazendo algo rápido / mágico. AFAIK não é. Tornar o loop explícito ajuda a conscientizar o escritor (e todos os leitores) e considerar outras implementações (por exemplo, um mapa).Respostas:
Não há um operador interno para fazê-lo no Go. Você precisa iterar sobre a matriz. Você pode escrever sua própria função para fazê-lo, assim:
Se você quiser verificar a associação sem iterar a lista inteira, precisará usar um mapa em vez de uma matriz ou fatia, assim:
fonte
Outra solução se a lista contiver valores estáticos.
por exemplo: verificação de um valor válido em uma lista de valores válidos:
fonte
Esta é uma citação do livro "Programming in Go: Criando aplicativos para o século XXI":
https://play.golang.org/p/UIndYQ8FeW
fonte
n*log(n) + log(n)
, é justo , pois são duas operações independentes consequentesO exemplo acima, usando sort, está próximo, mas no caso de strings, basta usar SearchString:
https://golang.org/pkg/sort/#SearchStrings
fonte
sort.SearchStrings
.Só tinha uma pergunta semelhante e decidiu tentar algumas das sugestões neste tópico.
Comparei os melhores e os piores cenários de três tipos de pesquisa:
aqui está o código da função:
os cenários de melhor caso escolhem o primeiro item nas listas; os piores casos usam valor inexistente.
aqui estão os resultados:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
O switch vence todo o caminho, o pior caso é surpreendentemente mais rápido que o melhor. Os mapas são os piores e a lista está mais perto de mudar.
Portanto, a moral é: se você tem uma lista estática e razoavelmente pequena, a instrução switch é o caminho a seguir.
fonte
:
vez de,
na instrução switch? Isso torna mais rápido?case
instruções em vez de um único caso. Os resultados são sensivelmente os mesmos com ambas as funções.Outra opção é usar um mapa como um conjunto. Você usa apenas as chaves e o valor é algo como um booleano que é sempre verdade. Depois, você pode facilmente verificar se o mapa contém a chave ou não. Isso é útil se você precisar do comportamento de um conjunto, onde se você adicionar um valor várias vezes, ele será incluído apenas uma vez.
Aqui está um exemplo simples em que adiciono números aleatórios como chaves em um mapa. Se o mesmo número for gerado mais de uma vez, não importa, ele aparecerá no mapa final apenas uma vez. Então eu uso um simples se verificar para ver se uma chave está no mapa ou não.
Aqui está em movimento
fonte
Isso é o mais próximo que consigo da sensação natural do operador "in" do Python. Você precisa definir seu próprio tipo. Em seguida, você pode estender a funcionalidade desse tipo adicionando um método como "has" que se comporta como você esperaria.
Eu tenho uma biblioteca de utilitários onde defino algumas coisas comuns como essa para vários tipos de fatias, como aquelas que contêm números inteiros ou minhas próprias estruturas.
Sim, é executado em tempo linear, mas esse não é o ponto. O objetivo é perguntar e aprender quais construções de linguagem comum o Go tem e não tem. É um bom exercício. Se essa resposta é tola ou útil, cabe ao leitor.
fonte