Erro de digitação em seu retorno declarado? Caso contrário, por que 321? Não deveria ser 320?
GreenMatt
3
@ me: Sim, agora eu vejo - o que se quer é a chave para a entrada em que o valor da entrada é o mínimo. Melhor redação da pergunta, por favor, pois outros obviamente pensavam o mesmo que eu.
GreenMatt
2
Dia da conscientização da estrutura de dados: se você sempre consultar (ou remover) o elemento mínimo, considere usar uma fila ou pilha prioritária.
Coronel Panic
Respostas:
597
Melhor: min(d, key=d.get)- não há razão para interpor uma lambdacamada indireta inútil ou extrair itens ou chaves!
@ KarelBílek significa que você passou como "d" uma lista [11, 22, 33], por exemplo , em vez de um dicionário, por exemplo {1: 11, 2:22, 3:33}. 'd.get' é válido para um dicionário, mas não para uma lista.
Home
9
e se duas chaves diferentes tiverem o mesmo valor? e eles têm o menor valor? como você pode fazê-lo retornar os dois?
user3226932
5
Esta técnica pode ser usada se os valores de dict forem listas, por exemplo:, d={"a":[10, None], "b":[20, None]}onde o min é calculado a partir de d [chave] [0]?
TrakJohnson
4
Como é que isso funciona? Que tipo de função min é essa, pensei que min () só aceitou valores ou listas individuais como argumentos. Como ele faz um loop sobre todas as entradas no dicionário?
azureai
2
min()retorne o valor no primeiro valor em classificado. chave designa a maneira de classificar os valores. key=d.getsignifica que a lista será classificada por valores do dicionário.
Notáveis6
45
Aqui está uma resposta que realmente fornece a solução solicitada pelo OP:
>>> d ={320:1,321:0,322:3}>>> d.items()[(320,1),(321,0),(322,3)]>>># find the minimum by comparing the second element of each tuple>>> min(d.items(), key=lambda x: x[1])(321,0)
O uso d.iteritems()será mais eficiente para dicionários maiores, no entanto.
Sua resposta é muito útil e provavelmente outras pessoas concordam: veja os vários comentários sobre esse assunto na resposta aceita. No entanto, eu precisava voltar duas vezes para encontrá-lo: você consideraria propor uma edição da resposta aceita? O seu é realmente complementar.
para criar uma classe ordenável, você deve substituir 6 funções especiais, para que elas sejam chamadas pela função min ()
esses métodos estão __lt__ , __le__, __gt__, __ge__, __eq__ , __ne__na ordem em que são menores que, menores que ou iguais, maiores que, maiores que ou iguais, iguais, diferentes de. por exemplo, você deve implementar da __lt__seguinte maneira:
Use a função zip para criar um iterador de tuplas contendo valores e chaves. Em seguida, envolva-o com uma função min que leva o mínimo com base na primeira tecla. Isso retorna uma tupla contendo um par (valor, chave). O índice de [1] é usado para obter a chave correspondente
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
β.εηοιτ.βε 12/06
@ β.εηοιτ.βε que melhor?
rajn 13/06
-1
# python
d={320:1,321:0,322:3}
reduce(lambda x,y: x if d[x]<=d[y]else y, d.iterkeys())321
1) Reduzir geralmente é mais lento que o iteroct. 2) A maioria das implementações de redução pode ser feita de maneira mais simples com uma ou todas. 3) Sou um porta-voz gigante para o GvR. 4) O módulo do operador torna desnecessárias a maioria das lambdas simples, e lambdas complexas devem ser definidas como funções reais de qualquer maneira. Talvez eu esteja com medo de programação funcional. ;)
MikeD
@ miked: conte-me mais. o que é gvr e qual é o módulo do operador? você poderia postar links? posso conhecer outras pessoas, mas ainda sou apenas um intermediário em python. querendo aprender! :-)
eruciform
GvR é Guido van Rossum, o ditador benevolente de Python para toda a vida. Aqui está um post de cinco anos dele explicando por que os lisp-isms (mapear, filtrar, reduzir, lambda) não têm muito lugar no python daqui para frente, e esses motivos ainda são verdadeiros hoje. O módulo do operador possui substituições para extrair membros : "lambda x: x [1]" comparado a "itemgetter (1)" é um caractere mais longo e possivelmente leva mais tempo para entender. Estou sem espaço, mas faça perguntas!
Respostas:
Melhor:
min(d, key=d.get)
- não há razão para interpor umalambda
camada indireta inútil ou extrair itens ou chaves!fonte
[11, 22, 33]
, por exemplo , em vez de um dicionário, por exemplo{1: 11, 2:22, 3:33}
. 'd.get' é válido para um dicionário, mas não para uma lista.d={"a":[10, None], "b":[20, None]}
onde o min é calculado a partir de d [chave] [0]?min()
retorne o valor no primeiro valor em classificado. chave designa a maneira de classificar os valores.key=d.get
significa que a lista será classificada por valores do dicionário.Aqui está uma resposta que realmente fornece a solução solicitada pelo OP:
O uso
d.iteritems()
será mais eficiente para dicionários maiores, no entanto.fonte
operator.itemgetter(1)
.Para várias chaves com o menor valor igual, você pode usar uma compreensão de lista:
Uma versão funcional equivalente:
fonte
min(d.items(), key=lambda x: x[1])[0]
fonte
fonte
key=d.get
é melhor.Para o caso em que você tem várias chaves mínimas e deseja simplificar
fonte
Se você não tiver certeza de que não possui vários valores mínimos, sugiro:
fonte
Editar: esta é uma resposta à pergunta original do OP sobre a chave mínima, não a resposta mínima.
Você pode obter as chaves do ditado usando a
keys
função, e você está certo sobre o usomin
para encontrar o mínimo dessa lista.fonte
Outra abordagem para resolver o problema de várias chaves com o mesmo valor mínimo:
fonte
Use
min
com um iterador (para python 3 use emitems
vez deiteritems
); em vez de lambda, use oitemgetter
operador from, que é mais rápido que o lambda.fonte
fonte
Comparei o desempenho das três opções a seguir:
Saída de amostra:
fonte
para criar uma classe ordenável, você deve substituir 6 funções especiais, para que elas sejam chamadas pela função min ()
esses métodos estão
__lt__ , __le__, __gt__, __ge__, __eq__ , __ne__
na ordem em que são menores que, menores que ou iguais, maiores que, maiores que ou iguais, iguais, diferentes de. por exemplo, você deve implementar da__lt__
seguinte maneira:então você pode usar a função min da seguinte maneira:
isso funcionou para mim.
fonte
Use a função zip para criar um iterador de tuplas contendo valores e chaves. Em seguida, envolva-o com uma função min que leva o mínimo com base na primeira tecla. Isso retorna uma tupla contendo um par (valor, chave). O índice de [1] é usado para obter a chave correspondente
fonte
fonte
min()
).É isso que você está procurando?
Imprime 'catorze'
fonte