1

J'écris python après avoir écrit clojure pendant un moment, et je suis un peu rouillé, mais je l'aborde dans un style beaucoup plus fonctionnel. Pour suivre un modèle que j'ai utilisé dans clojure, je veux utiliser la carte (ou la compréhension de liste) avec quelque chose comme assoc pour définir les clés dans chaque dict dans une liste.Y at-il une fonction python pour retourner un nouveau dict avec une nouvelle clé ajoutée, comme assoc dans clojure?

J'ai une liste d'enregistrements, et je veux les restructurer avec des compréhensions de liste.

L'enregistrement ressemble à ceci:

{ 
    "timestamp":1232435235315, 
    "data": { 
    "foo": 2345, 
    "bar": 1454 
    } 
} 

Je veux obtenir un dict contenant l'horodatage et les clés de données.

newlist = [ assoc(x, "timestamp", x["timestamp"]) for x in mylist ] 

je pourrais mettre en œuvre une assoc assez facilement, mais je voudrais qu'elle existe déjà dans une bibliothèque:

def assoc(coll, k, v): 
    newcoll = coll.copy() 
    newcoll[k] = v 
    return newcoll 

Est-ce que quelqu'un sait là-bas une bibliothèque qui contient déjà quelque chose comme ceci ou une façon pythonique de le faire de manière concise sans pour autant modifier la liste originale?

+0

Avez-vous vraiment besoin d'une bibliothèque pour effectuer deux opérations simples? –

+1

Non, mais si quelqu'un a une bibliothèque, il établit un modèle et a probablement d'autres fonctions qui seraient également utiles. Cela ne me dérangerait pas d'avoir une version pythonique de beaucoup de choses dans clojure.core. Je pourrais écrire une telle bibliothèque, mais je ne veux pas réinventer la roue si quelqu'un d'autre en a déjà une. – Mnebuerquo

Répondre

4

Bien sûr, vous pouvez simplement utiliser dict(), par exemple:

old = {"a": 1} 
new_one = dict(old, new_key=value) 
#or 
new_one = dict(old, {...}) 
+1

Une chose à faire attention avec ceci est qu'il ne copiera pas en profondeur les valeurs, donc toutes les références seront partagées entre les deux dictionnaires. – ryachza

+0

Oui, merci à @ryachza. Si vous voulez vraiment une copie profonde, vous pouvez utiliser 'from copy import deepcopy' et ensuite' new_one = deepcopy (dict (ancien, nouvelle_key = valeur)) '. – Sraw

+0

Je l'utilise dans mon code maintenant. Les structures que je cartographie récemment n'ont pas besoin de copie profonde, mais il est important d'être conscient des pièges. Merci Sraw et @ryachza. – Mnebuerquo