2016-02-24 32 views
6

ben bu verileri işlemek için deneyin:Python hesaplama

some_data = [ 
       {'value': 2, 'date':'2016-02-06'}, 
       {'value': 1, 'date':'2016-02-07'}, 
       {'value': 5, 'date':'2016-02-08'}, 
       {'value': 3, 'date':'2016-02-09'}, 
       {'value': 1, 'date':'2016-02-10'}, 
      ] 

Yani çalışan bir toplamı olarak güncellenen değerler içeren bir liste üretir. Şimdi bir çok satırlı döngü ile bunu: Ne var ki

def values_incremented(some_data): 
    temp_sum = 0 
    result = [] 
    for element in some_data: 
     temp_sum += element['value'] 
     result.append({'value': temp_sum, 'date': element['date']}) 
    return result 

nasıl döngü tek astar yapmak:

return [{'value': somehow_incremented, 'date': element['date']} for element in some_data] 
+0

İstediğiniz çıktı nedir? Şu an ne yapıyorsun? –

+1

@ nathan.meadows: soruyu tekrar okuyun. –

+0

For döngüsünüzde iki satır var ve bir satır istiyorsun. Doğru anladım mı? – AlokThakur

cevap

3

olduğunu. Okunabilir kalsın. İşte

def values_incremented(some_data): 
    return [{'value': current_sum, 'date': element['date']} 
     for element, current_sum 
     in zip(some_data, 
      reduce(lambda x, y: [y['value']] if not x else x + [x[-1] + y['value']], some_data, []))] 
+0

Bu bir GERÇEK tek liner :) Teşekkürler :) Ve evet, haklısın, orijinal kod çok daha okunabilir. Neyi çektiğim, temp_sum = 0' ve 'result = []' – alekwisnia

+0

gibi yedek bildirimleri azaltmaktı. Sadece baktım ... hiçbiri satır içi temiz görünmüyor: http://stackoverflow.com/questions/3432830/list-comprehension-for-running-total Eğer bunu çıkarırsanız, o zaman sorun değil. orijinal kod –

6

Kendine bir biriken jeneratör işlevi yazabiliriz. Jeneratörü değerlere göndermek ve yeni toplamı almak için send kullanın. Bunun sonucunda

def accumulator(n=0): 
    while True: 
     n += yield n 

acc = accumulator(0) 
acc.send(None) 

res = [{'value': acc.send(element['value']), 'date': element['date']} for element in some_data] 

, res kodunuzu ince, ben şey yapıyor tavsiye etmem

[{'value': 2, 'date': '2016-02-06'}, 
{'value': 3, 'date': '2016-02-07'}, 
{'value': 8, 'date': '2016-02-08'}, 
{'value': 11, 'date': '2016-02-09'}, 
{'value': 12, 'date': '2016-02-10'}] 
+1

Bu harika :-) yani bunun için +1 ... Ancak, döngü için basitçe daha okunabilir olduğunu düşünüyorum. –

1

doğrusal zamanda çalışan bir tek astar var:

söyleniyor

aşağıda bir yaklaşım

reduce(lambda (c,s), a: (c + [{'value':s+a['value'], 'date':a['date']}], s+a['value']), some_data,([],0))[0] 

>>> [{'date': '2016-02-06', 'value': 2}, 
    {'date': '2016-02-07', 'value': 3}, 
    {'date': '2016-02-08', 'value': 8}, 
    {'date': '2016-02-09', 'value': 11}, 
    {'date': '2016-02-10', 'value': 12}] 

Aynı sorunun daha basit bir versiyonu için other running total question bakmak gerekir .