2017-02-12 2 views
1

Как вы превращаете вероятности, которые не суммируются до одного, в вероятности, которые суммируются с одним, если вы не знаете количество ключей и имена ключей? Например:Как вы превращаете вероятности, которые не суммируются до 1 в те, которые делают?

a = {'g' = 0.1, 'b' = 0.05, 'u' = 0.15, 'i' = 0.2} 

To:

a = {'g' = 0.2, 'b' = 0.1, 'u' = 0.3, 'i' = 0.4} 
+2

вы имеете в виду? суммировать значения и применять коэффициент так, чтобы сумма была равна 1 и применялась ко всем ключам? –

ответ

5

Что вы намерены сделать, это называется нормализация: рассчитать sum и разделить все элементы этой суммы:

total_inv = 1.0/sum(a.values()) 
for key,val in a.items(): 
    a[key] = val*total_inv 

Или даже короче (например, @Jean-FrançoisFabre говорит) использовать dict понимание:

total_inv = 1.0/sum(a.values()) 
a = {k:v*total_inv for k,v in a.items()} 

, но это будет построить новый словарь, поэтому ссылки на старый словарь не обновляются.

В коде мы вычисляем 1.0/sum(..), потому что деление обычно более дорогое, чем умножение и, таким образом, может принести некоторую эффективность с этим.

+3

'a = {k: v * total_inv для k, v в a.items()}' –

+0

@ Jean-FrançoisFabre: спасибо. Обновлено. –

+0

Спасибо! Это сработало! –

1

После ответов для изготовления словарей here, это должно решить вашу проблему:

a = {'g':0.1, 'b': 0.05, 'u':0.15, 'i': 0.2} 
total = sum(a.values()) 
new_dict = dict((key, value/total) for (key, value) in a.items()) 
+1

просто используйте словарь, не нужно усложнять вещи. (См. Комментарий Жана к другому ответу). –

+3

'zip (a.keys(), a.values ​​())' is 'a.items()', за исключением того, что у нас могут не быть гарантий для порядка в Py2 –

+0

Оба хороших момента - отредактированы и см. Сообщение выше для более чистый подход. –

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