Não entendo bem a sintaxe por trás do sorted()
argumento:
key=lambda variable: variable[0]
Não é lambda
arbitrário? Por que é variable
indicado duas vezes no que parece ser um dict
?
fonte
Não entendo bem a sintaxe por trás do sorted()
argumento:
key=lambda variable: variable[0]
Não é lambda
arbitrário? Por que é variable
indicado duas vezes no que parece ser um dict
?
key
é uma função que será chamada para transformar os itens da coleção antes de serem comparados. O parâmetro passado para key
deve ser algo que pode ser chamado.
O uso de lambda
cria uma função anônima (que pode ser chamada). No caso do sorted
callable leva apenas um parâmetro. O Python lambda
é bem simples. Só pode fazer e retornar uma coisa realmente.
A sintaxe de lambda
é a palavra lambda
seguida pela lista de nomes de parâmetros e, em seguida, um único bloco de código. A lista de parâmetros e o bloco de código são delineados por dois pontos. Isso é semelhante a outras construções no pitão, bem como while
, for
, if
e assim por diante. São todas as instruções que normalmente têm um bloco de código. O Lambda é apenas mais uma instância de uma instrução com um bloco de código.
Podemos comparar o uso de lambda com o de def para criar uma função.
adder_lambda = lambda parameter1,parameter2: parameter1+parameter2
def adder_regular(parameter1, parameter2): return parameter1+parameter2
O lambda apenas nos fornece uma maneira de fazer isso sem atribuir um nome. O que o torna ótimo para usar como parâmetro em uma função.
variable
é usado duas vezes aqui, porque no lado esquerdo dos dois pontos é o nome de um parâmetro e, no lado direito, está sendo usado no bloco de código para calcular algo.
def
.Eu acho que todas as respostas aqui cobrem o núcleo do que a função lambda faz no contexto de classificado () bastante bem, no entanto, ainda me sinto uma descrição que leva a um entendimento intuitivo, então aqui estão meus dois centavos.
Por uma questão de completude, declararei o óbvio de antemão: sorted () retorna uma lista de elementos classificados e se queremos classificar de uma maneira específica ou se queremos classificar uma lista complexa de elementos (por exemplo, listas aninhadas ou uma lista de tuplas), podemos invocar o argumento principal.
Para mim, o entendimento intuitivo do argumento principal, por que ele deve ser exigível e o uso do lambda como a função solicitável (anônima) para realizar isso ocorre em duas partes.
A sintaxe do Lambda é a seguinte:
por exemplo
key
argumento é que ele deve receber um conjunto de instruções que apontarão essencialmente a função 'sorted ()' para os elementos da lista que devem ser usados para ordenar por. Quando dizkey=
, o que realmente significa é: À medida que eu percorre a lista um elemento de cada vez (por exemplo, para e na lista), vou passar o elemento atual para a função que forneço no argumento-chave e usar esse para criar uma lista transformada que me informará na ordem da lista final classificada.Confira:
Exemplo básico:
Exemplo 1:
Observe que minha função lambda disse ordenada para verificar se (e) era par ou ímpar antes da classificação.
MAS ESPERE! Você pode (ou talvez deva) estar se perguntando duas coisas - primeiro, por que minhas chances estão diante dos meus pares (já que meu valor-chave parece estar dizendo à minha função ordenada que priorize os pares usando o operador mod em
x%2==0
). Segundo, por que meus pares estão fora de ordem? 2 vem antes das 6, certo? Analisando esse resultado, aprenderemos algo mais profundo sobre como o argumento 'key' classificado () funciona, especialmente em conjunto com a função lambda anônima.Primeiro, você notará que, embora as probabilidades cheguem antes dos pares, os próprios pares não são classificados. Por que é isso?? Vamos ler os documentos :
Temos que ler um pouco as entrelinhas aqui, mas o que isso nos diz é que a função de classificação é chamada apenas uma vez e, se especificarmos o argumento da chave, classificaremos pelo valor que a função da chave nos aponta.
Então, o que o exemplo usando um módulo retorna? Um valor booleano:
True == 1
,False == 0
. Então, como os classificados lidam com essa chave? Basicamente, transforma a lista original em uma sequência de 1s e 0s.Agora estamos chegando a algum lugar. O que você ganha quando classifica a lista transformada?
Certo, agora sabemos por que as probabilidades vêm antes dos céus. Mas a próxima pergunta é: Por que os 6 ainda vêm antes dos 2 na minha lista final? Bem, isso é fácil - é porque a classificação acontece apenas uma vez! ou seja, esses 1s ainda representam os valores da lista original, que estão em suas posições originais uma em relação à outra. Como a classificação ocorre apenas uma vez e não chamamos nenhum tipo de função de classificação para ordenar os valores pares originais de baixo para alto, esses valores permanecem em sua ordem original em relação um ao outro.
A questão final é a seguinte: como conceitualmente como a ordem dos meus valores booleanos é transformada novamente nos valores originais quando imprimo a lista final classificada?
Sorted () é um método interno que (engraçado) usa um algoritmo de classificação híbrido chamado Timsortque combina aspectos de classificação de mesclagem e inserção. Parece-me claro que quando você o chama, existe um mecânico que mantém esses valores na memória e os agrupa com sua identidade booleana (máscara) determinada pela (...!) Função lambda. A ordem é determinada por sua identidade booleana calculada a partir da função lambda, mas lembre-se de que essas sublistas (de um e zeros) não são elas próprias classificadas por seus valores originais. Portanto, a lista final, embora organizada por Odds e Evens, não é classificada por sub-lista (os pares neste caso estão fora de ordem). O fato de que as probabilidades são ordenadas é porque elas já estavam em ordem por coincidência na lista original. O argumento de tudo isso é que, quando o lambda faz essa transformação, a ordem original dos sublistas é mantida.
Então, como isso tudo se relaciona com a pergunta original e, mais importante, com a nossa intuição de como devemos implementar a ordenação ordenada () com seu argumento principal e lambda?
Essa função lambda pode ser vista como um ponteiro que aponta para os valores que precisamos classificar, seja um ponteiro que mapeie um valor para seu booleano transformado pela função lambda ou se é um elemento específico em uma lista aninhada, tupla, dict, etc., novamente determinado pela função lambda.
Vamos tentar prever o que acontece quando executo o código a seguir.
Minha
sorted
ligação obviamente diz: "Classifique esta lista". O argumento-chave torna isso um pouco mais específico dizendo, para cada elemento (x) na minha lista, retorne o índice 1 desse elemento e, em seguida, classifique todos os elementos da lista original 'minha lista' pela ordem classificada da lista calculada por a função lambda. Como temos uma lista de tuplas, podemos retornar um elemento indexado dessa tupla. Então temos:Execute esse código e você descobrirá que esse é o pedido. Tente indexar uma lista de números inteiros e você verá que o código quebra.
Essa foi uma explicação longa, mas espero que isso ajude a 'classificar' sua intuição sobre o uso de funções lambda como o argumento principal em classificado () e além.
fonte
key
função. Se você está tentando entender asorted
função, alambda
sintaxe entra no caminho da compreensão.lambda
é uma palavra-chave Python usada para gerar funções anônimas .fonte
3
porque estão sendo passadas para uma função. As parênteses estão ao redor do lambda para que a expressão não seja analisada comolambda x: x+2(3)
, o que é inválido, pois2
não é uma função.O
variable
lado esquerdo do:
é um nome de parâmetro. O uso devariable
à direita está usando o parâmetroSignifica quase exatamente o mesmo que:
fonte
Mais um exemplo de uso da função classificada () com chave = lambda. Vamos considerar que você tem uma lista de tuplas. Em cada tupla, você tem uma marca, modelo e peso do carro e deseja classificar essa lista de tuplas por marca, modelo ou peso. Você pode fazer isso com lambda.
Resultados:
fonte
lambda
é uma função anônima, não uma função arbitrária. O parâmetro aceito seria a variável com a qual você está trabalhando e a coluna na qual você está classificando.fonte
Como o uso do lambda foi solicitado no contexto de
sorted()
, consulte também https://wiki.python.org/moin/HowTo/Sorting/#Key_Functionsfonte
Apenas para reformular, a tecla (Opcional. Uma função a ser executada para decidir a ordem. O padrão é Nenhum) nas funções classificadas espera uma função e você usa lambda.
Para definir lambda, você especifica a propriedade do objeto que deseja classificar e a função classificada interna do python cuidará dela automaticamente.
Se você deseja classificar por várias propriedades, atribua key = lambda x: (propriedade1, propriedade2).
Para especificar a ordem, passe reverse = true como o terceiro argumento (Opcional. Um booleano. Falso classificará em ascensão, True classificará em descendente. O padrão é False) da função classificada.
fonte
Resposta simples e não demorada, com um exemplo relevante para a pergunta feita Siga este exemplo:
Veja os nomes na lista, eles começam com D, B, C e A. E se você notar as idades, eles são 55, 44, 33 e 22. O primeiro código de impressão
Resultados para:
classifica o nome porque, por key = lambda el: el ["name"], estamos classificando os nomes e os nomes retornam em ordem alfabética.
O segundo código de impressão
Resultado:
classifica por idade e, portanto, a lista retorna por ordem crescente de idade.
Experimente este código para entender melhor.
fonte