2013-04-23 4 views
1

J'ai un dictionnaire, comme indiqué ci-dessous.en ajoutant des valeurs arithmétiques au dictionnaire?

band1= {'channel1': 10564, 'channel2': 10589, 'channel3': 10612, 'channel4': 10637,'channel5': 10662, 'channel6': 10687, 
'channel7': 10712, 'channel8': 10737, 'channel9': 10762, 'channel10': 10787,'channel11': 10812, 'channel12': 10837, } 

Je voudrais une bonne façon d'éditer ce dictionnaire. Pour chaque entrée, je veux une autre valeur ajoutée à la valeur/5 et une troisième valeur entrée avec une valeur/5-190

Le dictionnaire serait alors ressembler (avec les expressions réellement converties en leurs valeurs finales):

band1= {'channel1': [10564, 10564/5, 10564/5-190], 'channel2': [10589,10589/5,10589/5-190], 'channel3': [10612,10612/5,10612/5-190], 'channel4': [10637,10637/5,10637/5-190], 
'channel5': [10662,10662/5,10662/5-190], 'channel6': [10687,10687/5,10687/5-190], 
'channel7': [10712, 10712/5, 10712/5-190], 'channel8': [10737,10737/5,10737/5-190], 'channel9': [10762,10762/5,10762/5-190], 'channel10': [10787,10787/5,10787/5-190],'channel11': [10812,10812/5,10812/5-190], 'channel12': [10837,10837/5,10837/5-190]} 

Je dois faire cela avec beaucoup d'entrées, donc ce serait mieux que de simplement les taper tous si je pouvais les ajouter de manière pythonique. De plus, 5 ou 190 est variable pour les autres dictionnaires, il serait donc agréable de pouvoir faire varier cela facilement, une autre raison de ne pas coder en dur. Par exemple un autre dictionnaire pourrait avoir la règle que je dois diviser par 4 et ajouter 200 pour le deuxième élément, alors pour le troisième élément je pourrais devoir ajouter un autre nombre variable.

band2= {'channel1': [10564, 10564/4+200, 10564/4+200+100] 

Répondre

7

Une compréhension dict fera l'affaire:

var1 = 5 
var2 = -190 
{k: [v, v/var1, v/var1+var2] for k, v in band1.iteritems()} 

Pour Python 3, remplacer .iteritems() avec juste .items(), pour Python 2.6 et avant, utiliser une expression de générateur pour générer (clé, valeur) tuples :

dict((k, [v, v/var1, v/var1+var2]) for k, v in band1.iteritems()) 

pour votre deuxième dictionnaire var1 et var2 sont ensuite mis à 4 une d 200 respectivement.

Démo:

>>> {k: [v, v/var1, v/var1+var2] for k, v in band1.iteritems()} 
{'channel11': [10812, 2162, 1972], 'channel10': [10787, 2157, 1967], 'channel3': [10612, 2122, 1932], 'channel2': [10589, 2117, 1927], 'channel1': [10564, 2112, 1922], 'channel7': [10712, 2142, 1952], 'channel6': [10687, 2137, 1947], 'channel5': [10662, 2132, 1942], 'channel4': [10637, 2127, 1937], 'channel9': [10762, 2152, 1962], 'channel8': [10737, 2147, 1957], 'channel12': [10837, 2167, 1977]} 
+0

C'est très bien merci. Exactement ce que je cherche. – Paul

0

Autre option que je pense est agréable de mentionner est l'utilisation de chaînes:

band2= {'channel1': ['10564', '10564/4+200', '10564/4+200+100'] 

puis extraire la valeur avec eval:

>>> eval("10564/4+200") 
2841 
2

Si vous vouloir construire le dictionnaire à partir de zéro avec des valeurs comme celles-ci, qui peuvent prendre différentes formes, je irait pour les fonctions de petite assistance:

def manip1(k, a, b): 
    return [k, k/a, k/a - b] 

def manip2(k, a, b, c): 
    return you_name_it(k, a, b, c) 

# and then 
band1['channel2'] = manip1(10564, 5, 190) 
band1['channel3'] = manip2(10600, 5, 190, 200) 
+0

Merci, ce sera très utile pour utiliser d'autres formules si j'en ai besoin. – Paul

Questions connexes