2011-01-25 2 views
5

Можно создать дубликат:
List comprehension for running totalPython список понимание

Я пытаюсь написать краткое изложение список понимание для создания CDF: Например:

print f([0.2, 0.3,0.1,0.4]) 
[0.2,0.5,0.6,1.0] 

Стандартная процедура будет выглядеть так (я хочу написать понимание списка для th e function f()):

def f(probabilities) : 

    sum = 0 
    returnList = [] 
    for count in probabilities: 
     sum +=count 
     returnList = returnList + [sum] 
    return returnList 

Редактировать: Я нашел функцию numpy.cumsum(). Я проверю, использует ли он список.

+0

В чем проблема? – Elalfer

+0

@ Elalfer - Похоже, он хочет написать понимание списка, поведение которого идентично поведению функции 'f()'. –

+0

Это правильно. Мое плохое, я должен был быть более явным. – GeneralBecos

ответ

8

Эта операция настолько распространена, что многие языки (в основном функциональные, но не только) обеспечивают абстракции для нее, как правило, с именем scanl (это как reduce с промежуточными результатами). Давайте назовем это ireduce («итеративными уменьшить»):

def ireduce(f, state, it): 
    for x in it: 
     state = f(state, x) 
     yield state 

И теперь использовать:

import operator 

def f(probabilities): 
    return ireduce(operator.add, 0, probabilities) 

print(list(f([0.2, 0.3,0.1,0.4]))) 
# [0.2, 0.5, 0.6, 1.0] 
+0

Это хорошая вещь, чтобы иметь в своем инструменте; но, конечно, мы можем думать о более имених Пифонов, а не копировать то, что называет его другими языками? FWIW, C++ вызывает этот 'std :: partial_sum' и использует по умолчанию операцию добавления. –

+0

@Karl. Некоторые люди называют это ireduce, я вроде как. «partial_sum» - хорошее имя при добавлении, но с другими операциями кажется несколько вводящим в заблуждение. – tokland

8
[sum(probabilities[:i+1]) for i in range(len(probabilities))] 

Но не делайте этого, потому что это O (n^2). Соображения списка Python не были предназначены для этого. Используйте процедурный код, который вы уже написали.

+0

Теперь это одно замечательное понимание списка. – user225312

1

Это не очень красиво, и это не использует списковые, но вы можете сделать это с уменьшить() функция, где накопленное значение кортеж держит текущую сумму и список результатов: отсутствие

a = [0.2, 0.3, 0.1, 0.4] 
reduce((lambda result, val: (result[0] + val, result[1] + [result[0] + val])), a, (0, []))[1] 

Пайтона поддержки многострочной лямбды делает этот вид некрасиво. Использование отдельной функции было бы лучше:

a = [0.2, 0.3, 0.1, 0.4] 
    def accumulate(result, val): 
     return (result[0] + val, result[1] + [result[0] + val]) 

    reduce(accumulate, a, (0, []))[1] 
Смежные вопросы