J'ai un dict
qui a tout un tas d'entrées. Je ne suis intéressé que par quelques-uns d'entre eux. Existe-t-il un moyen facile de tailler tous les autres?
python
dictionary
mpen
la source
la source
Réponses:
Construire un nouveau dict:
Utilise la compréhension du dictionnaire.
Si vous utilisez une version qui en manque (c'est-à-dire Python 2.6 et versions antérieures), faites-la
dict((your_key, old_dict[your_key]) for ...)
. C'est la même chose, mais plus laid.Notez que cela, contrairement à la version de jnnnnn, a des performances stables (ne dépend que du nombre de your_keys) pour les
old_dict
s de n'importe quelle taille. Tant en termes de vitesse que de mémoire. Comme il s'agit d'une expression de générateur, elle traite un élément à la fois et ne passe pas en revue tous les éléments de old_dict.Suppression de tout en place:
la source
old_dict
indique un bogue ailleurs, et dans ce cas, je préfère de loin une erreur à des résultats silencieusement erronés.Compréhension du dict un peu plus élégante:
la source
mydict.iteritems()
place..items()
crée une autre liste.Voici un exemple en python 2.6:
La partie filtrage est l'
if
instruction.Cette méthode est plus lente que la réponse de Delnan si vous ne souhaitez sélectionner que quelques-unes des très nombreuses clés.
la source
if key in ('x','y','z')
je suppose.Vous pouvez le faire avec la fonction de projet de ma bibliothèque funcy :
Jetez également un œil à select_keys .
la source
Code 1:
Code 2:
Code 3:
Toutes les performances de code assemblées sont mesurées avec timeit en utilisant nombre = 1000, et collectées 1000 fois pour chaque morceau de code.
Pour python 3.6, les performances de trois façons de filtrer les touches dict sont presque les mêmes. Pour python 2.7, le code 3 est légèrement plus rapide.
la source
Ce liner lambda devrait fonctionner:
Voici un exemple:
Il s'agit d'une compréhension de base de la liste itérant sur vos clés dict (i en x) et génère une liste de paires de tuple (clé, valeur) si la clé réside dans la liste de clés souhaitée (y). Un dict () encapsule le tout pour produire un objet dict.
la source
set
pourwanted_keys
, mais sinon, il semble bon.dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
:, il revient{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
comme prévu.dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
et le résultat a été{}
, que j'ai supposé être un dict blanc.foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
:, j'obtiens:{'0': [1, 3], '2': [1, 4]}
quel est le résultat escomptéCompte tenu de votre dictionnaire d'origine
orig
et de l'ensemble des entrées qui vous intéressentkeys
:ce qui n'est pas aussi agréable que la réponse de delnan, mais devrait fonctionner dans toutes les versions de Python d'intérêt. Il est cependant fragile pour chaque élément
keys
existant dans votre dictionnaire d'origine.la source
Sur la base de la réponse acceptée par delnan.
Que faire si l'une de vos clés recherchées n'est pas dans l'ancien_dict? La solution delnan lèvera une exception KeyError que vous pouvez intercepter. Si ce n'est pas ce dont vous avez besoin, vous voudrez peut-être:
n'inclut que les clés qui s'exécutent à la fois dans l'ancien_dict et dans votre jeu de clés recherchées.
ont une valeur par défaut pour les clés qui n'est pas définie dans old_dict.
la source
{k: old_dict.get(k, default) for k in ...}
Cette fonction fera l'affaire:
Tout comme la version de delnan, celle-ci utilise la compréhension du dictionnaire et a des performances stables pour les grands dictionnaires (dépendant uniquement du nombre de clés que vous autorisez, et non du nombre total de clés dans le dictionnaire).
Et tout comme la version de MyGGan, celle-ci permet à votre liste de clés d'inclure des clés qui peuvent ne pas exister dans le dictionnaire.
Et en bonus, voici l'inverse, où vous pouvez créer un dictionnaire en excluant certaines clés dans l'original:
Notez que contrairement à la version de delnan, l'opération n'est pas effectuée sur place, donc les performances sont liées au nombre de clés dans le dictionnaire. Cependant, l'avantage de ceci est que la fonction ne modifiera pas le dictionnaire fourni.
Modifier: Ajout d'une fonction distincte pour exclure certaines touches d'un dict.
la source
keys
à tout type d'itérable, comme ce que l' ensemble accepte.invert
signifie que l'keys
argument est conservé ou que l'keys
argument est rejeté?", Combien d'entre elles seraient d'accord?Si nous voulons créer un nouveau dictionnaire avec les clés sélectionnées supprimées, nous pouvons utiliser la compréhension du dictionnaire
Par exemple:
la source
Une autre option:
Mais vous obtenez un
list
(Python 2) ou un itérateur (Python 3) retourné parfilter()
, pas undict
.la source
filtered
dansdict
et vous revenez le dictionnaire!Forme courte:
Comme la plupart des réponses le suggèrent afin de maintenir la concision, nous devons créer un objet en double, que ce soit un
list
oudict
. Celui-ci crée un jetablelist
mais supprime les clés dans l'originaldict
.la source
Voici une autre méthode simple à utiliser
del
dans une doublure:e_keys
est la liste des clés à exclure. Il mettra à jour votre dict plutôt que de vous en donner un nouveau.Si vous voulez un nouveau dict de sortie, faites une copie du dict avant de le supprimer:
la source
Vous pourriez utiliser
python-benedict
, c'est une sous-classe dict.Installation:
pip install python-benedict
C'est open-source sur GitHub: https://github.com/fabiocaccamo/python-benedict
Avertissement: je suis l'auteur de cette bibliothèque.
la source