3 votes

Faire passer une liste de dictionnaires par valeur

J'ai un peu de mal de tête dans une liste de dicts.

def funk(x):
    for i in x:
        i['a'] += 1
        print i

list1 = [{'a':1, 'b':2}, {'a':3, 'b':4}]
funk(list1)
print list1

cela produira un résultat :

{'a': 2, 'b': 2}
{'a': 4, 'b': 4}
[{'a': 2, 'b': 2}, {'a': 4, 'b': 4}]

mais je veux avoir ça :

{'a': 2, 'b': 2}
{'a': 4, 'b': 4}
[{'a':1, 'b':2}, {'a':3, 'b':4}]

Comment puis-je faire list1 restent intacts ? eg : [{'a':1, 'b':2}, {'a':3, 'b':4}]

7voto

NPE Points 169956

funk() pourrait faire une copie de x et modifier cette copie au lieu de modifier l'original. x .

import copy

def funk(x):
    x = copy.deepcopy(x)
    for i in x:
        i['a'] += 1
        print i

list1 = [{'a':1, 'b':2}, {'a':3, 'b':4}]
funk(list1)
print list1

1voto

mgilson Points 92954

Il me semble que le copy d'un dictionnaire pourrait vous aider ici :

def funk(x):
    for i in x:
        new_dict = i.copy()
        new_dict['a'] += 1
        print new_dict

1voto

Lattyware Points 37257

Évidemment, la viabilité de l'opération dépend de la complexité et de l'objectif de l'opération, mais au lieu de modifier votre liste sur place, utilisez une fonction compréhension de la liste pour en créer un nouveau :

def funk(x):
    return [{key: value+1 if key == "a" else value for key, value in i.items()} for i in x]

Dans votre exemple, vous imprimez les valeurs, donc cela ne serait pas utile, mais si votre intention peut être remplie en ayant une nouvelle liste modifiée de dicts, cela pourrait être la meilleure voie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X