web-dev-qa-db-fra.com

Renvoyer une copie du dictionnaire en excluant les clés spécifiées

Je souhaite créer une fonction qui renvoie une copie d'un dictionnaire à l'exclusion des clés spécifiées dans une liste.

Considérant ce dictionnaire:

my_dict = {
    "keyA": 1,
    "keyB": 2,
    "keyC": 3
}

Un appel à without_keys(my_dict, ['keyB', 'keyC']) doit retourner:

{
    "keyA": 1
}

Je voudrais faire ceci dans une ligne avec une compréhension ordonnée de dictionnaire mais j'ai des problèmes. Ma tentative est la suivante:

def without_keys(d, keys):
    return {k: d[f] if k not in keys for f in d}

qui est la syntaxe invalide. Comment puis-je faire ceci?

15
Juicy

Vous étiez proche, essayez l'extrait ci-dessous:

>>> my_dict = {
...     "keyA": 1,
...     "keyB": 2,
...     "keyC": 3
... }
>>> invalid = {"keyA", "keyB"}
>>> def without_keys(d, keys):
...     return {x: d[x] for x in d if x not in keys}
>>> without_keys(my_dict, invalid)
{'keyC': 3}

Fondamentalement, le if k not in keys ira à la fin de la compréhension du dict dans le cas ci-dessus.

23
mu 無

Dans votre compréhension du dictionnaire, vous devriez parcourir votre dictionnaire (pas k, vous ne savez pas ce que c'est non plus). Exemple -

return {k:v for k,v in d.items() if k not in keys}
8
Anand S Kumar

Cela devrait fonctionner pour vous.

def without_keys(d, keys):
    return {k: v for k, v in d.items() if k not in keys}
3
Morgan Thrapp

Pour ceux qui n'aiment pas les compréhensions de liste, voici ma version:

def without_keys(d, *keys):
     return dict(filter(lambda key_value: key_value[0] not in keys, d.items()))

Usage:

>>> d={1:3, 5:7, 9:11, 13:15}
>>> without_keys(d, 1, 5, 9)
{13: 15}
>>> without_keys(d, 13)
{1: 3, 5: 7, 9: 11}
>>> without_keys(d, *[5, 7])
{1: 3, 13: 15, 9: 11}
1
Himel Das