J'ai plusieurs listes ayant toutes le même nombre d'entrées (chacune spécifiant une propriété d'objet):
property_a = [545., 656., 5.4, 33.]
property_b = [ 1.2, 1.3, 2.3, 0.3]
...
et liste avec des drapeaux de même longueur
good_objects = [True, False, False, True]
(qui pourrait facilement être remplacée par une liste d'index équivalente:
good_indices = [0, 3]
Quelle est la meilleure façon de générer de nouvelles listes property_asel
, property_bsel
... qui ne contiennent que les valeurs indiquées soit par les True
entrées ou les indices?
property_asel = [545., 33.]
property_bsel = [ 1.2, 0.3]
zip
dans Python 2 va créer une nouvelle liste, mais sur Python 3, il renverra simplement un générateur (paresseux).from itertools import izip
et utiliser cela au lieu dezip
dans le premier exemple. Cela crée un itérateur, identique à Python 3.Je vois 2 options.
Utilisation de numpy:
En utilisant une compréhension de liste et en la compressant:
la source
[property_b[i] for i in good_indices]
est un bon pour une utilisation sansnumpy
Utilisez la fonction zip intégrée
ÉDITER
Il suffit de regarder 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
la source
itertools.compress
ici. La compréhension de la liste est beaucoup plus lisible, sans avoir à déterrer ce que fait la compresse.En supposant que vous ne disposiez que de la liste des éléments et d'une liste des indices vrais / requis, cela devrait être le plus rapide:
Cela signifie que la sélection de propriété ne fera que le nombre de tours qu'il y a d'indices vrais / requis. Si vous avez beaucoup de listes de propriétés qui suivent les règles d'une seule liste de balises (vrai / faux), vous pouvez créer une liste d'index en utilisant les mêmes principes de compréhension de liste:
Cela parcourt chaque élément de good_objects (tout en se souvenant de son index avec enumerate) et ne retourne que les indices où l'élément est vrai.
Pour ceux qui ne comprennent pas la liste, voici une version en prose en anglais avec le code surligné en gras:
lister l' index pour chaque groupe d' index, élément qui existe dans une énumération de bons objets , si (où) l' élément est Vrai
la source
Les langages Matlab et Scilab offrent une syntaxe plus simple et plus élégante que Python pour la question que vous posez, donc je pense que le mieux que vous puissiez faire est d'imiter Matlab / Scilab en utilisant le package Numpy en Python. En faisant cela, la solution à votre problème est très concise et élégante:
Numpy essaie d'imiter Matlab / Scilab mais cela a un coût: vous devez déclarer chaque liste avec le mot-clé "array", quelque chose qui surchargera votre script (ce problème n'existe pas avec Matlab / Scilab). Notez que cette solution est limitée aux tableaux de nombres, ce qui est le cas dans votre exemple.
la source
filter
la bibliothèque intégrée de Python ou la bibliothèque externepandas
. Si vous souhaitez changer de langue, vous pouvez également essayer R, mais ce n'est pas ce que la question pose .