2016-01-11 2 views
1

je le code suivant:itérer sur les valeurs à l'intérieur aa clé d'un dict dans un dict

dict_1= { 

    'key1':{'key1':[.56,.75], 'key2':[]}, 
    'key2':{'key1':[.76,.95], 'key2':[]}, 
    'key3':{'key1':[.96,1.05],'key_2':[]} 
    } 
    def zones_calc(ftp): 
     var_1 = ftp 
     for i in dict_1.iteritems(): 
      for v in i['key_1']: 
     i[key_2.append(var_1 * v)] 
zones_calc(200) 

Je continue à obtenir une erreur:

TypeError: tuple indices must be integers, not str 

Je suis nouveau à coder en python et je J'utilise ceci comme une opportunité de travailler avec des dictionnaires. J'ai réussi à bien travailler en utilisant des listes et des tuples, et cela fonctionne très bien. J'essaie d'utiliser un dict pour garder mes multiples et résultats dans un dict. Ce que j'essaie de faire est évidemment de multiplier ce qui est dans «key_1» et de l'ajouter dans «key_2» dans chacune des clés dict.

Toute aide serait géniale.

Répondre

2

Tout d'abord vous utilisez key_1 pour rechercher dans votre dictionnaire et vous n'avez aucune clé dans votre dictionnaire avec la valeur key_1, vous avez plusieurs key1 donc je suppose que c'est ce que vous voulez.

Deuxièmement, vous souhaitez indenter i[key_2.append(var_1 * v)] et changer quelque chose comme value['key2'].append(var_1 * v): Encore une fois, je suppose que vous voulez key2 comme clé dans vos dictionnaires, au lieu de key_2 et vous voulez aussi chercher la valeur et de multiplier la valeur de var_1 (ne pas ajouter quelque chose à l'index de la liste, cela n'a aucun sens).

Enfin lorsque vous itérez dictionnaires si vous ne spécifiez pas deux valeurs votre itération variable de contexte sera la clé des dictionnaires si vous voulez que les valeurs que vous aurez besoin de quelque chose comme:

for key, value in dict_1.iteritems():, au lieu de for i in dict_1.iteritems():.

Maintenant, si je comprends bien ce que vous voulez, cela pourrait être une solution:

dict_1= { 

    'key1':{'key1':[.56,.75], 'key2':[]}, 
    'key2':{'key1':[.76,.95], 'key2':[]}, 
    'key3':{'key1':[.96,1.05],'key2':[]} 
    } 


def zones_calc(ftp): 
    var_1 = ftp 
    for key, value in dict_1.iteritems(): 
     for v in value['key1']: 
      value['key2'].append(var_1 * v) 

zones_calc(200) 
print dict_1 

qui sort:

$ python example11.py 
{'key3': {'key2': [192.0, 210.0], 'key1': [0.96, 1.05]}, 'key2': {'key2': [152.0, 190.0], 'key1': [0.76, 0.95]}, 'key1': {'key2': [112.00000000000001, 150.0], 'key1': [0.56, 0.75]}} 

Hope this helps. Notez que j'ai essayé de changer votre code pour pouvoir travailler, je n'ai pas essayé de le rendre plus "pythonique".

Espérons que cela aide. :)

+1

compris! Merci pour l'explication détaillée. J'ai une meilleure prise en main maintenant. Je vois maintenant pourquoi je recevais l'erreur. Il semble que je passais la clé au lieu de la valeur. Et oui, c'était exactement ce que je cherchais en conséquence. La réponse ci-dessus utilise dict, values ​​() et fonctionne aussi, mais cela fonctionne mieux pour moi car ce n'était qu'un simple exemple de la dict que j'utiliserai et avoir des clés et des variables de valeur me donneront de la flexibilité. –

1

Essayez ceci:

dict_1= { 
    'key1':{'key1':[.56,.75], 'key2':[]}, 
    'key2':{'key1':[.76,.95], 'key2':[]}, 
    'key3':{'key1':[.96,1.05],'key2':[]} 
} 

def zones_calc(ftp): 
    var_1 = ftp 
    for v1 in dict_1.values(): 
     for v in v1['key1']: 
      v1['key2'].append(var_1 * v) 

zones_calc(200) 

Voici le résultat:

{'key3': {'key2': [192.0, 210.0], 'key1': [0.96, 1.05]}, 
'key2': {'key2': [152.0, 190.0], 'key1': [0.76, 0.95]}, 
'key1': {'key2': [112.00000000000001, 150.0], 'key1': [0.56, 0.75]}} 

La partie fractionnaire sur la dernière ligne est due à virgule flottante roundoff:

>>> 0.56 * 200 
112.00000000000001 
>>>