Preciso escolher alguns elementos da lista fornecida, conhecendo seu índice. Digamos que eu gostaria de criar uma nova lista, que contenha elemento com o índice 1, 2, 5, da lista fornecida [-2, 1, 5, 3, 8, 5, 6]. O que eu fiz é:
a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [ a[i] for i in b]
Existe alguma maneira melhor de fazer isso? algo como c = a [b]?
lambda
função.Respostas:
Você pode usar
operator.itemgetter
:Ou você pode usar numpy :
Mas, na verdade, sua solução atual está correta. É provavelmente o mais legal de todos eles.
fonte
c = [a[i] for i in b]
está perfeitamente bem. Observe que aitemgetter
solução não fará a mesma coisa se b tiver menos de 2 elementos.a[b]
funciona apenas quandoa
é uma matriz numpy , ou seja, você a cria com uma função numpy.Alternativas:
fonte
build-in
funções__getitem__
não parece ser comparável, por exemplo, como mapear o tipo do item?map(type(a.__getitem__), b)
lambda x: type(a.__getitem__(x)), b
,. Nesse caso, o uso[..]
é mais compacto:lambda x: type(a[x]), b
Outra solução poderia ser via pandas Series:
Em seguida, você pode converter c em uma lista, se desejar:
fonte
Teste básico e não muito extenso, comparando o tempo de execução das cinco respostas fornecidas:
usando a seguinte entrada:
loop python simples foi o mais rápido com a operação lambda por um segundo próximo, mapIndexValues e getIndexValues eram consistentemente bastante semelhantes ao método numpy significativamente mais lento após a conversão de listas em matrizes numpy.Se os dados já estiverem em matrizes numpy, o método numpyIndexValues com a conversão numpy.array removida é mais rápido.
fonte
numpyIndexValues
não funciona desde entãoa
,b
é do tiporange
. Eu estou supondo que você mento para convertera
,b
anumpy.ndarrays
primeira?Tenho certeza de que isso já foi considerado: se a quantidade de índices em b for pequena e constante, basta escrever o resultado da seguinte forma:
Ou ainda mais simples se os próprios índices forem constantes ...
Ou se houver um intervalo consecutivo de índices ...
fonte
[a] + [b] = [a, b]
Aqui está uma maneira mais simples:
fonte
Minha resposta não usa coleções numpy ou python.
Uma maneira trivial de encontrar elementos seria a seguinte:
Desvantagem: esse método pode não funcionar para listas maiores. O uso de numpy é recomendado para listas maiores.
fonte
a
.[a[i] for i in b]
a
tivesse outros 5 nele?[a[i] if i<len(a) else None for i in b]
Índices estáticos e pequena lista?
Não esqueça que se a lista for pequena e os índices não mudarem, como no seu exemplo, às vezes o melhor é usar a descompactação de sequência :
O desempenho é muito melhor e você também pode salvar uma linha de código:
fonte
Tipo de maneira pitônica:
fonte
O(n)
solução em umaO(n^2)
solução e, ao mesmo tempo, quase dobrou o tamanho do código. Você também deve observar que a abordagem falhará se a lista contiver objetos com igualdade difusa ou parcial; por exemplo, sea
contiverfloat('nan')
, isso sempre aumentará aValueError
.