2012-05-26 3 views
2

У меня есть код python 2.7 для квадратов значений в FreqDist (т. Е. Распределение частоты NLTK) и сумма всех квадратов.значения квадратов квадратов в FreqDist, python

Например, из этого: Вы должны получить: 2 * 2 + 1 * 1 + 1 * 1 + 1 * 1 = 7

Это работает для меня, но мне было интересно, есть ли «лучший» способ сделать это, чем это:

 for word, frequency in t.freq_dist.iteritems(): 
      total += frequency*frequency 

Я спрашиваю, потому что мне нужно, чтобы затем цикл через freq_dist снова для чего-то другого; сразу же после этого кода, так что я понял, что это не хорошая практика, чтобы перебрать его дважды, если есть лучший способ ...

ответ

1
lst = [2, 1, 1, 1] 

Использование generator expression:

sum(i**2 for i in lst) 

дает

7 

В качестве альтернативы, list comprehension также работает:

sum([i**2 for i in lst]) 

Если вам не нужны квадратные значения для какой-либо цели позже, то выражение генератора является лучшим выбором, поскольку он создает значения только один раз по требованию, тогда как понимание списка создает весь список в памяти. Для получения дополнительной информации см. Этот вопрос SO comparing list comprehension vs generators.

+1

Избегайте создания списка с помощью 'sum (i ** 2 for i in lst)' –

+0

Нет необходимости в двойном парсе, когда генератор является единственным аргументом функции. –

1

Если вы используете Numpy, вы можете просто квадрат массива:

>>> from numpy import array 
>>> values = array([2, 1, 1, 1]) 
>>> sum(values**2) 
7 

Если вы собираетесь делать какие-либо повторяющиеся, тяжелые вычисления, я предлагаю вам использовать Numpy. Это даст вам огромное ускорение скорости.

+0

К сожалению, здесь нет массива; NLTK не использует Numpy как можно больше. –

+0

Но не преобразует ли список в массив? – Blender

+0

примечание: FreqDist - это словарь, а не список – Zach

0

Если вторая петля имеет зависимость от total, нет, лучшего способа сделать это не будет. Если у него нет, то есть такая зависимость, да, лучший (то есть более быстрый) способ сделать это должен включать работу из другого цикла внутри текущего цикла. Но на самом деле ускорение должно быть несущественным.

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