Eu tenho uma lista:
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
o elemento max é 55 (dois elementos nas posições 9 e 12)
Preciso encontrar em quais posições o valor máximo está situado. Por favor ajude.
informará o índice da primeira instância do maior elemento valorizado da lista
a
.fonte
A resposta escolhida (e a maioria das outras) exige pelo menos duas passagens na lista.
Aqui está uma solução de uma passagem que pode ser uma escolha melhor para listas mais longas.
Editado: Para solucionar as duas deficiências apontadas por @John Machin. Pois (2) tentei otimizar os testes com base na probabilidade estimada de ocorrência estimada de cada condição e nas inferências permitidas dos predecessores. Foi um pouco complicado descobrir os valores apropriados de inicialização para
max_val
emax_indices
que funcionaram em todos os casos possíveis, especialmente se o valor máximo foi o primeiro valor da lista - mas acredito que sim.fonte
[]
como anunciado ("Lista de devolução"). O código deve ser simplesif not seq: return []
. (2) O esquema de teste em loop é subótimo: em média, em listas aleatórias, a condiçãoval < maxval
será a mais comum, mas o código acima realiza 2 testes em vez de um.==
vez de 2 - suaelif
condição sempre será verdadeira.elif
eu mesmo, FWIW. ;-)Eu vim com o seguinte e funciona como você pode ver
max
,min
e outras funções em listas como estas:Portanto, considere o próximo exemplo de lista e descubra a posição do máximo na lista
a
:Usando o gerador
enumerate
e fazendo uma fundiçãoNeste ponto, podemos extrair a posição de max com
O exposto acima nos diz que o máximo está na posição 4 e seu valor é 5.
Como você vê, no
key
argumento, é possível encontrar o máximo sobre qualquer objeto iterável, definindo um lambda apropriado.Espero que contribua.
PD: Como @PaulOyster observou em um comentário. Com
Python 3.x
omin
emax
permita uma nova palavra-chavedefault
que evite a exceção de aumentoValueError
quando o argumento estiver vazio.max(enumerate(list), key=(lambda x:x[1]), default = -1)
fonte
Não consigo reproduzir o desempenho do @ SilentGhost-beat citado por @martineau. Aqui está o meu esforço com comparações:
=== maxelements.py ===
Resultados de um laptop antigo e obsoleto executando o Python 2.7 no Windows XP SP3:
fonte
É assim que eu costumo fazer.
fonte
Você também pode usar o pacote numpy:
Isso retornará uma matriz numpy de todos os índices que contêm o valor máximo
se você quiser transformar isso em uma lista:
fonte
fonte
Também é possível obter uma solução, que fornece apenas a primeira aparência , usando
numpy
:fonte
@shash respondeu isso em outro lugar
Qual deles passa . No entanto, é mais lento que a solução do @Silent_Ghost e, ainda mais, do @nmichaels:
fonte
Aqui está o valor máximo e os índices em que aparece:
Mais tarde: para a satisfação do @SilentGhost
fonte
heapq
- encontrar o máximo seria trivial.heapq
solução, duvido que funcionasse.Idéia semelhante com uma compreensão de lista, mas sem enumerar
fonte
a[i]
chamada.Apenas uma linha:
fonte
Se você deseja obter os índices dos maiores
n
números em uma lista chamadadata
, pode usar o Pandassort_values
:fonte
fonte
Este código não é tão sofisticado quanto as respostas postadas anteriormente, mas funcionará:
ilist no código acima conteria todas as posições do número máximo na lista.
fonte
Você pode fazer isso de várias maneiras.
A velha maneira convencional é,
Outra maneira, sem calcular o comprimento da lista e armazenar o valor máximo para qualquer variável,
Podemos fazê-lo de maneira pitônica e inteligente! Usando a compreensão da lista em apenas uma linha,
Todos os meus códigos estão em Python 3.
fonte