1
votes

Remplacement des éléments d'une liste dans un dictionnaire par des éléments d'un autre dictionnaire

J'ai les dictionnaires suivants:

d1 = {"00f_5" :["AAA","AAC",3], "00f_6": ["CCC",2,3]}

Je voudrais la sortie suivante:

d1 = {"00f_5" :[1,2,3], "00f_6": [1,2,3]}

d2 = [{"marker":"00f_5",1: 'AAA'},{"marker":"00f_6", 1: 'CCC'},{"marker":"00f_5", 2:"AAC"}]

J'ai essayé plusieurs tentatives, mais je ne pouvait pas l'obtenir. Toute aide serait très appréciée.


1 commentaires

Veuillez publier ce que vous avez tenté jusqu'à présent et où avez-vous rencontré des problèmes. [SO]: Comment créer un exemple minimal, complet et vérifiable (mcve) .


3 Réponses :


0
votes

Bien que je ne vous donne pas le programme complet, vous pouvez essayer de comprendre et de jouer avec le code suivant:

d2 = [{"marker":"00f_5",1: 'AAA'},{"marker":"00f_6", 1: 'CCC'},{"marker":"00f_5", 2:"AAC"}]

for d in d2:
  for key, value in d.items():
    if key == "marker":
      marker = value
    else:
      reference = value
      content = key
  print("Marker: {}, Reference: {}, Content: {}".format(marker, reference, content))


0 commentaires

3
votes

Vous pouvez créer un dict qui mappe le marqueur à un sous-dict qui mappe les touches numériques aux codes à 3 lettres, de sorte que, étant donné un marqueur et une touche numérique, vous pouvez utiliser dict.get code > méthode pour obtenir le code mappé s'il existe:

{'00f_5': ['AAA', 'AAC', 3], '00f_6': ['CCC', 2, 3]}

de sorte que donné:

d1 = {"00f_5" :[1,2,3], "00f_6": [1,2,3]}
d2 = [{"marker":"00f_5",1: 'AAA'},{"marker":"00f_6", 1: 'CCC'},{"marker":"00f_5", 2:"AAC"}]

d1 sera devenir:

d = {}
for s in d2:
    d.setdefault(s['marker'], {}).update(s)
d1 = {k: [d[k].get(i, i) for i in l] for k, l in d1.items()}


0 commentaires

0
votes

Je ne suggérerais pas d'écraser le premier dict. Créez-en un nouveau ( d3 ).

Donné

d3 = {}
for d in lst:
    key = d["marker"]
    value = d1[key]
    for k, v in d.items():     
    if not isinstance(k, int):                         # skip to numeric keys
            continue
        if key not in d3:                              # fill missing entries
            d3[key] = value
        idx = k - 1
        d3[key][idx] = v                               # overwrite list item

d3
{'00f_5': ['AAA', 'AAC', 3], '00f_6': ['CCC', 2, 3]}

Code

d1 = {"00f_5" :[1,2,3], "00f_6": [1,2,3]}

lst = [
    {"marker":"00f_5",1: 'AAA'}, 
    {"marker":"00f_6", 1: 'CCC'},
    {"marker":"00f_5", 2:"AAC"}
]


0 commentaires