2008-11-06 10 views
3

J'ai ce dictionnaire python « mondict », contenant des tableaux, voici à quoi il ressemble:plusieurs occurrences dans les tableaux imbriqués

mydict = dict(
    one=['foo', 'bar', 'foobar', 'barfoo', 'example'], 
    two=['bar', 'example', 'foobar'], 
    three=['foo', 'example']) 

je voudrais remplacer toutes les occurrences de « exemple » par "un autre mot".

Alors que je peux déjà penser à quelques façons de le faire, y at-il une méthode plus "pythonique" pour y parvenir?

Répondre

2
for arr in mydict.values(): 
    for i, s in enumerate(arr): 
     if s == 'example': 
      arr[i] = 'someotherword' 
+0

La question est subjective, par conséquent, elle ne devrait pas avoir une réponse acceptée. Le code ci-dessus est le code le plus simple que je puisse penser pour la tâche * spécifique * mais je n'appellerais pas le plus "pythonique" (on pourrait utiliser différentes priorités pour la tâche et cela conduirait à un code différent.) – jfs

2

Si vous voulez quitter la vierge d'origine, et il suffit de retourner un nouveau dictionnaire avec les modifications appliquées, vous pouvez utiliser:

replacements = {'example' : 'someotherword'} 

newdict = dict((k, [replacements.get(x,x) for x in v]) 
       for (k,v) in mydict.iteritems()) 

Cela a aussi l'avantage que son facile à étendre avec de nouvelles mots simplement en les ajoutant à la dict de remplacement. Si vous voulez muter un dict existant en place, vous pouvez utiliser la même approche:

for l in mydict.values(): 
    l[:]=[replacements.get(x,x) for x in l] 

Cependant, il va probablement être une solution plus lente que J.F Sebastian's, car il reconstitue toute la liste plutôt que de modifier les éléments modifiés dans endroit.

1

est ici une autre prise:

for key, val in mydict.items(): 
    mydict[key] = ["someotherword" if x == "example" else x for x in val] 

J'ai trouvé que les listes de construction est très rapide, mais le profil de cours si la performance est importante.