0
votes

Comment fusionner plusieurs dictionnaires par une boucle for?

Voici mon code:

{ 'sara':{'gender':'f' , 'lan':'python'} , 'john':{'gender':'m' , 'lan':'python'}}

Ma contribution:

{'john':{'gender':'m' , 'lan':'python'}

La sortie doit être comme:

{ 'sara':{'gender':'f' , 'lan':'python'} , 'john':{'gender':'m' , 'lan':'python'}}

Mais j'obtiens toujours le dernier élément de dictionnaire que j'ai écrit dans l'entrée:

2 
f.sara.python
m.john.java

Comment puis-je le résoudre et obtenir un dictionnaire comme ci-dessous?

a = int(input())

for i in range(a):
    b = input()
    
    b = b.split(".")#creating a list

    #print(b)
    
    b[1]= b[1].lower()
    b[1]=b[1].capitalize()
    a=b[1]
    #print(b[1])
    
    #print(b[0] , b [1] , b[2])

    dic = {}
    dic_final={}
    dic={b[1] : {'name':b[0] ,'lan':b[2] }}
    dic_final.update(dic)
    del(dic)


print(dic_final) 


0 commentaires

4 Réponses :


1
votes

Vous écrasez le dictionnaire dic_final dans la boucle for à chaque fois. Cette ligne est à l'origine du problème dic_final={}

Solution: ajoutez cette ligne avant votre «boucle for» et supprimez la déclaration à l'intérieur. dic_final = dict()

Meilleur style de codage:

2
f.sara.python
m.john.java
{'Sara': {'gender': 'f', 'lan': 'python'}, 'John': {'gender': 'm', 'lan': 'java'}}

Production:

a = int(input())

dic_final = dict()

for i in range(a):
    b = input()
    
    gender, name, lan = b.split(".")

    name = name.capitalize()
    dic_final.update({name : {"gender": gender, "lan": lan}})

print(dic_final)


0 commentaires

1
votes

Créez un dictionnaire global au lieu d'en créer un local dans la boucle for. De plus dans votre code, vous name gender comme name

2
f.sara.python
m.john.java
{'Sara': {'gender': 'f', 'lan': 'python'}, 'John': {'gender': 'm', 'lan': 'java'}}

Production:

a = int(input())

dic_final = {}

for i in range(a):
    b = input()
    
    b = b.split(".")
    
    b[1]= b[1].lower()
    b[1]=b[1].capitalize()
    a=b[1]

    dic={b[1] : {'gender':b[0] ,'lan':b[2] }}
    dic_final.update(dic)
    del(dic)


print(dic_final) 


0 commentaires

1
votes

La raison pour laquelle vous n'obtenez que la dernière entrée est que vous réinitialisez le dictionnaire à chaque itération.

Tout ce que vous avez à faire est de rendre "dic_final" global.


0 commentaires

2
votes

c'est une solution très claire que j'ai trouvée

    num_sample = int(input("how many test cases?: "))
    final = {}
    for case in range(num_sample):
        new_case = input("insert new case: ")
        gender, name, lan = new_case.split(".")
        info = {"gender": gender, "lan": lan}
        final[name] = info

    #access final from here


0 commentaires