2013-04-23 2 views
1

У меня есть словарь, как показано ниже.добавление арифметических значений в словарь?

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, } 

Мне бы понравился хороший способ редактирования этого словаря. Для каждой записи я хочу еще один добавили со значением является значение/5 и третье значение, введенное с этим значение/5-190

Словарь будет выглядеть (с выражениями фактически преобразуется в конечных значения):

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]} 

Я должен сделать это с большим количеством записей, поэтому было бы лучше, чем просто набирать их все, если бы я мог добавить их в питоническом стиле. Кроме того, 5 или 190 является переменной для других словарей, поэтому было бы неплохо иметь возможность легко варьировать это, а другая причина - не жесткому коду. Например, у другого словаря может быть правило, которое мне нужно разделить на 4 и добавить 200 для второго элемента, тогда для третьего элемента мне может потребоваться добавить другое число переменных.

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

ответ

7

ДИКТ понимание будет делать трюк:

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

Для Python 3, заменить .iteritems() только с .items() для Python 2.6 и выше, использовать выражение генератора для генерации (ключ, значение) кортежи :

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

для вашего второго словаря var1 и var2 затем устанавливаются в 4 в d 200 соответственно.

Демо:

>>> {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

Это большое спасибо. Именно то, что я ищу. – Paul

0

Другой вариант Я думаю, что это приятно отметить использует строки:

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

, а затем извлечь значение с eval:

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

Если вы хотите построить словарь с нуля с такими значениями, которые могут иметь различную форму, я будет идти на мелкие вспомогательные функции:

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

Спасибо, это будет очень полезно для использования других формул, если мне нужно. – Paul

Смежные вопросы