2009-08-20 4 views
1

J'ai un dictionnaire, appelons-le myDict, en Python qui contient un ensemble de dictionnaires similaires qui ont tous l'entrée "turned_on : True" ou "turned_on : False". Je souhaite supprimer toutes les entrées myDict désactivées, par ex. où "turned_on : False". Dans Ruby, je ferais quelque chose comme ceci:Comment supprimer des entrées dans un dictionnaire avec un drapeau donné en python?

myDict.delete_if { |id,dict| not dict[:turned_on] } 

Comment dois-je faire cela en Python?

+0

avez-vous une faute de frappe dans 'id2'? vous n'avez pas de clé 'turn_off', n'est-ce pas? – SilentGhost

+0

Oui. Merci de l'avoir signalé! –

+0

pourquoi l'étiquette de rubis? –

Répondre

5

droit chemin vers l'avant:

def delete_if_not(predicate_key, some_dict): 
    for key, subdict in some_dict.items(): 
     if not subdict.get(predicate_key, True): 
      del some_dict[key] 

Test:

mydict = { 
     'test1': { 
       'turned_on': True, 
       'other_data': 'foo', 
      }, 
     'test2': { 
      'turned_on': False, 
      'other_data': 'bar', 
      }, 
     } 
delete_if_not('turned_on', mydict) 
print mydict 

Les autres réponses sur cette page afin de créer une autre bien dict. Ils ne suppriment pas les clés de votre dict.

+0

il semble être garanti que tous les 'subdicts' ont une clé''on tourne ''. – SilentGhost

+0

ajoutant le contrôle ne m'a coûté rien et la fonction est maintenant plus générique (peut être utilisé dans toute dict de dicts). – nosklo

3

On ne sait pas ce que vous voulez, mais je pense:

myDict = {i: j for i, j in myDict.items() if j['turned_on']} 

ou ancienne version de python:

myDict = dict((i, j) for i, j in myDict.iteritems() if j['turned_on']) 
+1

Est-ce une chose Python3.0? Vous ne pouvez pas faire des 'dict dict' en 2.5, certainement. –

+1

Python 3.0 est une version stable de python. J'ai ajouté la version py2k pour les downvoters qui ne peuvent pas étendre cette syntaxe primitive. – SilentGhost

+0

@SilentGhost: Bien que je ne veuille pas vous déprécier, python 3 n'est pas encore largement utilisé, en raison du manque de bibliothèques tierces utiles pour faire des choses simples, comme la connexion à certains SGBDR, fournissant ainsi une réponse py3 seulement pour un moment. – nosklo

7

Vous voulez dire comme ça?

myDict = {"id1" : {"turned_on": True}, "id2" : {"turned_on": False}} 
result = dict((a, b) for a, b in myDict.items() if b["turned_on"]) 

sortie:

{'id1': {'turned_on': True}} 
+0

'turn_off' était juste une faute de frappe dans la question. – SilentGhost

+0

Merci, je l'ai corrigé –

1
d = { 'id1':{'turned_on':True}, 'id2':{'turned_on':False}} 
dict((i,j) for i, j in d.items() if not j['turned_on']) 
Questions connexes