2017-10-16 9 views
4

Comment puis-je ajouter des clés à une dict dans une liste, si la dict contient une certaine clé, à partir de valeurs d'une autre liste?Ajout de clés à des dicts dans une liste, à partir des valeurs d'une liste

J'ai une liste de dicts. Ces dicts ne contiennent qu'une seule clé ('review'), ou deux clés ('review' et 'response'). Lorsque le dict contient la clé 'response', je veux ajouter deux clés, avec des valeurs provenant de deux listes.

data = [{'response': 'This is a response', 
     'review': 'This is a review'}, 
     {'review': 'This is only a review'}, 
     {'response': 'This is also a response', 
     'review': 'This is also a review'}] 
date = ['4 days ago', 
     '3 days ago'] 
responder = ['Manager', 
      'Customer service'] 

J'ai essayé ce qui suit, mais puisque pour chaque dict qui contient la clé « réponse » Je veux seulement ajouter 1 à partir des valeurs de chaque liste, je ne sais pas comment faire. La sortie me montre que, bien sûr, il ne fait qu'ajouter les dernières valeurs des listes depuis que je suis en boucle sur les listes. Comment puis-je réparer cela?

[{'date': '3 days ago', 
    'responder': 'Customer service', 
    'response': 'This is a response', 
    'review': 'This is a review'}, 
{'review': 'This is only a review'}, 
{'date': '3 days ago', 
    'responder': 'Customer service', 
    'response': 'This is also a response', 
    'review': 'This is also a review'}] 
+0

Comment décidez-vous quel élément de 'date' et 'responder' devrait être ajouté ed comme valeur à un dictionnaire? –

+0

Les réponses, les dates et les répondants ont été raclés et analysés en même temps, de sorte que la première révision avec une réponse appartient à la première date et le premier répondeur. – Lisadk

+1

pourriez-vous s'il vous plaît fournir la production attendue! – DexJ

Répondre

4

vous pouvez créer un itérateur pour date et les listes répondeur, puis appelez next() dans votre instruction if pour prendre l'élément suivant de la liste

data = [{'response': 'This is a response', 
     'review': 'This is a review'}, 

     {'review': 'This is only a review'}, 

     {'response': 'This is also a response', 
     'review': 'This is also a review'}] 

date = ['4 days ago', '3 days ago'] 
responder = ['Manager', 'Customer service'] 

d_iter = iter(date) 
r_iter = iter(responder) 

for d in data: 
    if 'response' in d: 
     d['date'] = next(d_iter) 
     d['responder'] = next(r_iter) 

print(data) 
>> [ 
{'date': '4 days ago', 
'review': 'This is a review', 
'responder': 'Manager', 
'response': 'This is a response'}, 

{'review': 'This is only a review'}, 

{'date': '3 days ago', 
'review': 'This is also a review', 
'responder': 'Customer service', 
'response': 'This is also a response'} 
] 
+1

Beau travail. J'ai résolu cela en utilisant des générateurs, mais la combinaison 'iter' et' next' est beaucoup plus propre que les boucles 'for' avec des ruptures. – Vinny

0

Je pense que vous essayez d'ajouter deux entrées avec Date comme clé et les valeurs sont différentes. Dans le dictionnaire, vous ne pouvez pas avoir des clés en double. C'est pourquoi, après le for loop Dictionary est mis à jour avec une seule entrée de clé de date et une seule réponse

2

Vous pouvez essayer cela, mais attention, en raison du nombre de response sur votre liste devrait être égale à la longueur de vos listes:

d_r = zip(date, responder) 

for d in data: 
    if 'response' in d: 
      d['date'], d['responder'] = next(d_r) 
print(data)