0
votes

Comment ajouter une valeur dans un dictionnaire en le parcourant en boucle?

J'ai un dictionnaire, et selon les valeurs que j'ai, je veux créer une autre 'variable'; et de le mettre dans le dictionnaire. Je suis capable de créer l'autre variable mais ce que j'essaie de faire pour la mettre dans le dictionnaire ne fonctionne pas. Mon code est:

mydict = {'1':('a','example','var_a'),'2':('b','example','test_b'),'3':('c','example','var_c'),'4':('d','example','test_d')}

La dernière ligne de la fonction est censée créer un autre dictionnaire (mais ne l'est pas) car je ne suis pas sûr de pouvoir accéder à mon dictionnaire final sans créer un nouveau dictionnaire. Ce que j'aimerais avoir, c'est:

mydict = {'1':('a','example'),'2':('b','example'),'3':('c','example'),'4':('d','example')}

def to_use (dictionary):
    for key, val in dictionary.iteritems():
        if len(val) == 1:
            if val[0] == 'a':
                new = 'var_a'
            elif val[0] == 'b':
                new = 'test_b'
            elif val[0] == 'c':
                new = 'var_c'
            elif val[0] == 'd':
                new = 'test_d'
        new_dict[key.lower()].append(new)

to_use(mydict)

Si quelqu'un a une solution .. Merci!


3 commentaires

Vous ne pouvez pas ajouter aux tuples car ils sont immuables. Vous avez besoin de listes à la place.


(mais ne l'est pas) Eh bien, pourquoi ne fonctionne-t-il pas comme prévu? lire et poster les messages d'erreur, ce sont des indices.


Cela me donne une erreur de clé, renvoyant la première clé trouvée. Je sais que les tuples sont immuables mais l'idée était de créer d'abord un nouveau dictionnaire.


3 Réponses :


0
votes

Une approche consiste à créer un dictionnaire des valeurs à ajouter pour chaque tuple, ce qui simplifiera la recherche par exemple. a avec var_a , et utilisez-le pour créer un nouveau dictionnaire comme ceci

{'1': ('a', 'example', 'var_a'), 
'2': ('b', 'example', 'test_b'), 
'3': ('c', 'example', 'var_c'), 
'4': ('d', 'example', 'test_d')}

La sortie sera

mydict = {'1':('a','example'),'2':('b','example'),'3':('c','example'),'4':('d','example')}

def to_use(dictionary):

    # Mapping of element to add to tuple
    mapping = {'a': 'var_a', 'b': 'test_b', 'c': 'var_c', 'd': 'test_d'}

    #Iterate through dictionary
    for key, val in dictionary.iteritems():
        #For each key, add a 1 element-tuple to each value
        dictionary[key] = val + (mapping[val[0]],)

    return dictionary

print(to_use(mydict))


5 commentaires

Merci Devesh mais malheureusement je ne peux pas faire manuellement la cartographie du dictionnaire mais j'ai des milliers de possibilités. L'idée de ce code était de créer au moins ce dictionnaire de mappage, car après cela, je peux m'en occuper. Mais même cela, je ne suis pas capable de le faire.


Mais vos milliers de possibilités doivent être répertoriées quelque part, par exemple dans un fichier texte, vous pouvez l'utiliser pour créer ce dictionnaire de mappage, c'est bien mieux que d'en avoir mille sinon


Je liste les cas où la longueur de la 1ère valeur est 1, 2, puis je mets quelque chose avec> 2 pour couvrir toutes les possibilités car je ne peux pas en prédire la longueur. Je ne peux pas couvrir toutes les possibilités, même dans un fichier Excel. Mon programme les couvre tous, maintenant je cherche juste à créer un dictionnaire entre la clé et la nouvelle variable que je crée.


quel programme couvre les possibilités, vous pouvez également générer vos possibilités en utilisant itertools.product ou itertools.combinations. Jetez un œil à docs.python.org/3/library/itertools.html


Salut @LoC, ma suggestion a-t-elle un sens pour vous? Si oui, envisagez de voter pour la réponse :)



0
votes

Je pense qu'il y a plusieurs problèmes avec le code. Laissez-moi essayer de les aborder un par un.

1) les tuples sont immuables Les valeurs de votre dictionnaire sont des tuples et ne peuvent donc pas être modifiées. Vous pouvez soit les changer en liste par ['a', 'example'] au lieu de ('a', 'example') .

Ou remplacez-les par un nouveau tuple pendant votre boucle.

mydict = {'1':['a','example'],'2':['b','example'],'3':['c','example'],'4':['d','example']}

def to_use (dictionary):
    for key, val in dictionary.iteritems():
        if val[0] == 'a':
            new = 'var_a'
        elif val[0] == 'b':
            new = 'test_b'
        elif val[0] == 'c':
            new = 'var_c'
        elif val[0] == 'd':
            new = 'test_d'
        else:
            new = None
        if new is not None:
            dictionary[key].append(new)

to_use(mydict)

2) Vous recherchez une longueur de 1 en utilisant if len (val) == 1: . Pour vos données d'exemple, ce n'est jamais vrai. Ainsi, il n'y a pas de nouvelle variable lorsque vous atteignez new_dict[key.lower() .append(new).

Je suggérerais de supprimer le if.

3) Vous n'avez jamais déclaré new_dict comme étant un dictionnaire donc new_dict [key.lower ()]. ​​append (new) échoue.

Essayez le code suivant en utilisant des tuples:

mydict = {'1':('a','example'),'2':('b','example'),'3':('c','example'),'4':('d','example')}

def to_use (dictionary):
    for key, val in dictionary.iteritems():
        if val[0] == 'a':
            new = 'var_a'
        elif val[0] == 'b':
            new = 'test_b'
        elif val[0] == 'c':
            new = 'var_c'
        elif val[0] == 'd':
            new = 'test_d'
        else:
            new = None
        if new is not None:
            dictionary[key] = val + (new,)

to_use(mydict)

Ou le code suivant en utilisant des listes:

dictionary[key] = val + (new,)

Les deux devraient fonctionner comme prévu.


2 commentaires

Bonjour codingpoets, merci pour vos commentaires! Vous avez raison de dire que c'était un problème de longueur, je l'ai corrigé. J'ai essayé votre code après, mais rien ne se passe, cela me dit: TypeError: peut seulement concaténer la liste (pas "tuple") pour lister Et quand j'essaye de créer un nouveau dictionnaire comme: newdict [key] = val + (nouveau,) rien ne se passe, le nouveau dictionnaire est vide ..


@LoC J'aurais probablement dû marquer le Ou plus clairement pour les deux options. Vous avez probablement mélangé les deux solutions. Je voulais que vous soit changez les valeurs des tuples en listes, ou utilisez dictionary [key] = val + (new,) . Assurez-vous que vous utilisez votre valeur d'origine mydict avec le code et non avec celui adapté. J'ai modifié ma réponse pour inclure les deux versions. J'espère que cela le rend clair.



0
votes

J'ai trouvé la solution en déclarant le nouveau dictionnaire que j'ai créé comme defaultdict (liste).

Merci pour l'aide!


0 commentaires