2011-01-11 3 views

Répondre

19

Cela devrait le faire:

for k in dic.keys(): 
    if k.startswith('s_'): 
    dic.pop(k) 
+0

sacrément. battu moi à la réponse - stachoverflow me laisse seulement poster une réponse par 3 minutes – tekknolagi

+1

+1 FWIW Je préfère pop à del – inspectorG4dget

+2

Ce n'est pas une bonne idée, en général, de muter quelque chose que vous itérez - et sur Python 3, ' keys' est un 'dictview', pas une liste. – agf

4

Que diriez-vous quelque chose comme ceci:

dic = dict([(x,y) for x,y in dic.items() if not x.startswith('s_')]) 
+1

ne supprime pas les clés de la dict. Il crée une nouvelle dict sans les clés, à la place. – nosklo

+1

Il est intéressant que vous sentiez le besoin de voter en plus de fournir votre propre réponse. Je suppose que le pédantisme est bien vivant, hein? Je me demande (ne l'ayant pas testé) si la suppression de la liste existante est en fait * plus rapide * que la création d'un nouveau. C'était en fait sa première question. –

+2

Je n'ai pas voté bas, mais (1) @nosklo est correct (2) le mot est "pedantry" (3) vous omettez de mentionner que le code devrait différer entre 2.x et 3.x (iteritems vs articles) (4) les crochets sont redondants dans Python moderne (5) si elle est plus rapide ou non sera influencée par combien de touches commencent par 's_' –

2

Vous pouvez utiliser une compréhension dictionnaire Python 3:

{k: v for k, v in dic.items() if not k.startswith("s_")} 

Cette syntaxe similaire Python 2 fait la même chose:

dict((k, v) for k, v in dic.items() if not k.startswith("s_")) 

Notez que ces deux derniers créent un nouveau dictionnaire (que vous pouvez renvoyer à dic si vous le souhaitez) plutôt que de muter le dictionnaire existant.

+0

Cela ne supprime pas les clés de la dict. Il crée une nouvelle dict sans les clés, à la place. – nosklo

+0

Je ne vois pas comment c'est faux, puisque la question ne spécifiait pas la mutation du dictionnaire en place. –

+2

La question demande spécifiquement d'enlever les clés de la dict. – nosklo

17
for k in dic.keys(): 
    if k.startswith('s_'): 
     del dic[k] 
+0

+1 Cependant, FWIW je préfère pop à del – inspectorG4dget

+12

mais 'del' est le moyen préféré et c'est plus rapide. C'est-à-dire, "a = {'x': 1}; a.pop ('x')" prend 0.286 μsec par boucle alors que "a = {'x': 1}; del a ['x']" prend seulement 0,178 μsec par boucle. –

+6

Non seulement cela, mais c'est également sémantiquement meilleur. 'del' indique que vous souhaitez supprimer l'entrée tandis que' pop' vous indique que vous souhaitez le récupérer. Donc dans ce cas je préfère del à pop. ;) – johndodo

1

python 3 pour éviter l'erreur:

RuntimeError: dictionary changed size during iteration 

Cela devrait le faire:

list_keys = list(dic.keys()) 
for k in list_keys: 
    if k.startswith('s_'): 
    dic.pop(k) 
Questions connexes