Tenho várias listas com o mesmo número de entradas (cada uma especificando uma propriedade de objeto):
property_a = [545., 656., 5.4, 33.]
property_b = [ 1.2, 1.3, 2.3, 0.3]
...
e lista com sinalizadores do mesmo comprimento
good_objects = [True, False, False, True]
(que poderia ser facilmente substituído por uma lista de índice equivalente:
good_indices = [0, 3]
Qual é a maneira mais fácil de gerar novas listas property_asel
, property_bsel
... que contêm apenas os valores indicados quer pelas True
entradas ou os índices?
property_asel = [545., 33.]
property_bsel = [ 1.2, 0.3]
zip
no Python 2 criará uma nova lista, mas no Python 3 retornará apenas um gerador (lento).from itertools import izip
e usar isso em vez dozip
primeiro exemplo. Isso cria um iterador, igual ao Python 3.Vejo 2 opções.
Usando numpy:
Usando uma lista de compreensão e compactá-la:
fonte
[property_b[i] for i in good_indices]
é um bom para usar semnumpy
Use a função integrada zip
EDITAR
Basta olhar para os novos recursos do 2.7. Agora existe uma função no módulo itertools que é semelhante ao código acima.
http://docs.python.org/library/itertools.html#itertools.compress
fonte
itertools.compress
daqui. A compreensão da lista é muito mais legível, sem ter que desenterrar o que essa compressão está fazendo.Supondo que você tenha apenas a lista de itens e uma lista de índices verdadeiros / obrigatórios, este deve ser o mais rápido:
Isso significa que a seleção da propriedade só fará tantas rodadas quantos forem os índices verdadeiros / obrigatórios. Se você tiver muitas listas de propriedades que seguem as regras de uma única lista de tags (verdadeiro / falso), pode criar uma lista de índices usando os mesmos princípios de compreensão de lista:
Isso itera por meio de cada item em good_objects (enquanto lembra seu índice com enumerar) e retorna apenas os índices onde o item é verdadeiro.
Para quem não está entendendo a lista, aqui está uma versão em prosa em inglês com o código destacado em negrito:
liste o índice para cada grupo de índice, item que existe em uma enumeração de objetos bons , se (onde) o item é Verdadeiro
fonte
As linguagens Matlab e Scilab oferecem uma sintaxe mais simples e elegante do que Python para a pergunta que você está fazendo, então acho que o melhor que você pode fazer é imitar Matlab / Scilab usando o pacote Numpy em Python. Ao fazer isso, a solução para o seu problema é muito concisa e elegante:
O Numpy tenta imitar o Matlab / Scilab, mas tem um custo: você precisa declarar todas as listas com a palavra-chave "array", algo que sobrecarregará seu script (esse problema não existe no Matlab / Scilab). Observe que esta solução é restrita a matrizes de número, que é o caso em seu exemplo.
fonte
filter
biblioteca interna ou externa do Pythonpandas
. Se você vai trocar de idioma, também pode tentar R, mas não é isso que a pergunta está perguntando .