2015-11-16 1 views
0

J'ai:Python: Comment modifier des paires spécifiques (clé, valeur) à la liste des dicts?

l = [{"a": 2}, {"a": 4}, {"a": 10}, {"a": 11}] 

J'ai besoin de multiplier par 2 tous "a" clés dict. Je devrais donc:

l = [{'a': 4}, {'a': 8}, {'a': 20}, {'a': 22}] 

je peux le faire par ce code:

for i in l: 
    i.update({"a": 2 * i["a"]}) 

Mais il est laid.

Il devrait y avoir une belle doublure Pythonic.

+4

Quel est le problème avec 'pour i dans l: i [ 'a'] * = 2'? – TigerhawkT3

+1

'l.update ((a, b * 2) pour a, b dans l.items())'? – Maroun

+0

@MarounMaroun J'ai essayé celui-ci. 'AttributeError: l'objet 'list' n'a pas d'attribut 'update'' –

Répondre

1

Il s'agit d'un code de ligne mettant à jour les dictionnaires et renvoyant la liste. Cependant, si les dictionnaires ne possèdent pas la clé a, cela augmente KeyError. Et, tous les dictionnaires sont mis à jour jusqu'à ce qu'une exception se produise. J'espère que cela aide mais la lisibilité du code est si importante que la simple mise à jour du dictionnaire dans la boucle ne coûte pas cher.

>>> l = [{"a": 2}, {"a": 4}, {"a": 10}, {"a": 11}] 
>>> map(lambda x:(x,x.__setitem__("a",x["a"]*2))[0],l) 
[{'a': 4}, {'a': 8}, {'a': 20}, {'a': 22}] 
0
l = [{k:v*2} for d in l for k, v in d.items()] 
+0

Il ne fonctionnera pas si je vais avoir dict avec des touches différentes de '" a "' –

+0

@ viakondratiuk- Ce n'est pas grave si vous avez des clés différentes –

0

Cela prend également en compte s'il est en fait une a clé.

for d in l: 
    if 'a' in d: 
    d['a'] *= 2 

Ou

for d in l: 
    try: 
    d['a'] *= 2 
    except KeyError: 
    # No key `a` 
    pass