Python: Sélectionner un sous-ensemble de la liste basée sur l'indice d'ensemble
J'ai plusieurs listes ayant tous le même nombre d'entrées (chaque spécification d'une propriété de l'objet):
property_a = [545., 656., 5.4, 33.]
property_b = [ 1.2, 1.3, 2.3, 0.3]
...
et de la liste avec des drapeaux de la même longueur
good_objects = [True, False, False, True]
(qui pourrait facilement être remplacé par un équivalent de l'indice de la liste:
good_indices = [0, 3]
Quelle est la façon la plus simple de générer de nouvelles listes de property_asel
, property_bsel
, ... qui ne contiennent que les valeurs indiquées soit par le True
les entrées ou les indices?
property_asel = [545., 33.]
property_bsel = [ 1.2, 0.3]
InformationsquelleAutor fuenfundachtzig | 2010-07-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement utiliser compréhension de liste:
ou
Le dernier est plus rapide car il y a moins de
good_indices
que la longueur deproperty_a
, en supposantgood_indices
sont précalculées au lieu de généré à la volée.Modifier: La première option est équivalente à
itertools.compress
disponibles depuis le Python 2.7/3.1. Voir @Gary Kerr's réponse.zip
ici introduire une perte de performance?zip
en Python 2 créer une nouvelle liste, mais sur Python 3, il va juste revenir un (paresseux) générateur.from itertools import izip
et l'utiliser à la place dezip
dans le premier exemple. Qui crée un itérateur, de même que Python 3.Je vois 2 options.
Utilisation de numpy:
À l'aide d'une liste de la compréhension et de la fermeture-éclair:
[property_b[i] for i in good_indices]
est un bon pour une utilisation sansnumpy
Utiliser le construit en fonction de zip
MODIFIER
Simplement en regardant les nouvelles fonctionnalités de 2.7. Il y a maintenant une fonction dans le module itertools qui est similaire au code ci-dessus.
http://docs.python.org/library/itertools.html#itertools.compress
itertools.compress
ici. La compréhension de liste est présent plus lisible, sans avoir à creuser jusqu'à ce que le diable compresser est en train de faire.En supposant que vous n'avez que la liste des éléments et une liste de vrai/requis indices, ce devrait être le plus rapide:
Cela signifie que la propriété de sélection ne pourra faire autant de tours qu'il y a du vrai et nécessaire indices. Si vous avez beaucoup de listes de propriété que de suivre les règles d'un seul balises (vrai/faux) liste, vous pouvez créer une liste des indices à l'aide de la même compréhension de liste principes:
Ce parcourt chaque élément dans good_objects (tout en se souvenant de son index avec énumérer) et renvoie uniquement les indices d'où l'article est vrai.
Pour quiconque n'est pas d'avoir la liste de compréhension, voici une prose anglaise version avec le code surligné en gras:
liste les index pour chaque groupe de indice, élément qui existe dans un énumération de les bons objets, si (où) les article est Vrai
Matlab et Scilab langues offre un moyen plus simple et plus élégant de la syntaxe de Python pour la question posée, donc je pense que le mieux que vous pouvez faire est d'imiter Matlab/Scilab à l'aide de la Numpy paquet Python. En faisant cela, la solution à votre problème est très concis et élégant:
Numpy tente d'imiter Matlab/Scilab, mais il a un coût: vous devez déclarer chaque liste avec le mot-clé "array", quelque chose qui ne va pas surcharger votre script (ce problème n'existe pas avec Matlab/Scilab). Notez que cette solution est limitée à des tableaux de nombre, ce qui est le cas dans ton exemple.
filter
ou de la bibliothèque externepandas
. Si vous voulez remplacer les langues, vous pouvez également essayer de R, mais ce n'est pas la question.