Pythonの辞書のリストでアイテムの累積合計を見つける方法

NG_21

私は次のようなリストを持っています

a=[{'time':3},{'time':4},{'time':5}]

このように逆の順序で値の累積合計を取得したい

b=[{'exp':3,'cumsum':12},{'exp':4,'cumsum':9},{'exp':5,'cumsum':5}]

これを取得するための最も効率的な方法は何ですか?私は使用しては、他の回答読んでいるnumpyようなソリューションを提供します

a=[1,2,3]
b=numpy.cumsum(a)

しかし、私は辞書にもcumsumを挿入する必要があります

クレイグ・バーグラー
a=[{'time':3},{'time':4},{'time':5}]
b = []
cumsum = 0
for e in a[::-1]:
    cumsum += e['time']
    b.insert(0, {'exp':e['time'], 'cumsum':cumsum})
print(b)

出力:

[{'exp': 3, 'cumsum': 12}, {'exp': 4, 'cumsum': 9}, {'exp': 5, 'cumsum': 5}]


したがって、リストの先頭への挿入は 遅いこと わかります(O(n))。代わりに、 deque (O(1))を試してください

from collections import deque


a=[{'time':3},{'time':4},{'time':5}]
b = deque()
cumsum = 0
for e in a[::-1]:
    cumsum += e['time']
    b.appendleft({'exp':e['time'], 'cumsum':cumsum})
print(b)
print(list(b))

出力:

deque([{'cumsum': 12, 'exp': 3}, {'cumsum': 9, 'exp': 4}, {'cumsum': 5, 'exp': 5}])
[{'cumsum': 12, 'exp': 3}, {'cumsum': 9, 'exp': 4}, {'cumsum': 5, 'exp': 5}]


これは、ITTの各アプローチの速度をテストするためのスクリプトと、タイミング結果を含むグラフです。

ここに画像の説明を入力してください

from collections import deque
from copy import deepcopy
import numpy as np
import pandas as pd
from random import randint
from time import time


def Nehal_pandas(l):
    df = pd.DataFrame(l)
    df['cumsum'] = df.ix[::-1, 'time'].cumsum()[::-1]
    df.columns = ['exp', 'cumsum']
    return df.to_json(orient='records')


def Merlin_pandas(l):
    df           = pd.DataFrame(l).rename(columns={'time':'exp'})
    df["cumsum"] = df['exp'][::-1].cumsum()
    return df.to_dict(orient='records')


def RahulKP_numpy(l):
    cumsum_list = np.cumsum([i['time'] for i in l][::-1])[::-1]
    for i,j in zip(l,cumsum_list):
        i.update({'cumsum':j})


def Divakar_pandas(l):
    df = pd.DataFrame(l)
    df.columns = ['exp']
    df['cumsum'] = (df[::-1].cumsum())[::-1]
    return df.T.to_dict().values()


def cb_insert_0(l):
    b = []
    cumsum = 0
    for e in l[::-1]:
        cumsum += e['time']
        b.insert(0, {'exp':e['time'], 'cumsum':cumsum})
    return b


def cb_deque(l):
    b = deque()
    cumsum = 0
    for e in l[::-1]:
        cumsum += e['time']
        b.appendleft({'exp':e['time'], 'cumsum':cumsum})
    b = list(b)
    return b


def cb_deque_noconvert(l):
    b = deque()
    cumsum = 0
    for e in l[::-1]:
        cumsum += e['time']
        b.appendleft({'exp':e['time'], 'cumsum':cumsum})
    return b


def hpaulj_gen(l, var='value'):
    cum=0
    for i in l:
        j=i[var]
        cum += j
        yield {var:j, 'sum':cum}


def hpaulj_inplace(l, var='time'):
    cum = 0
    for i in l:
        cum += i[var]
        i['sum'] = cum


def test(number_of_lists, min_list_length, max_list_length):
    test_lists = []

    for _ in range(number_of_lists):
        test_list = []
        number_of_dicts = randint(min_list_length,max_list_length)
        for __ in range(number_of_dicts):
            random_value = randint(0,50)
            test_list.append({'time':random_value})
        test_lists.append(test_list)

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        res = list(hpaulj_gen(l[::-1], 'time'))[::-1]
    elapsed_time = time() - start_time
    print('hpaulj generator:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        hpaulj_inplace(l[::-1])
    elapsed_time = time() - start_time
    print('hpaulj in place:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        res = cb_insert_0(l)
    elapsed_time = time() - start_time
    print('craig insert list at 0:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        res = cb_deque(l)
    elapsed_time = time() - start_time
    print('craig deque:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        res = cb_deque_noconvert(l)
    elapsed_time = time() - start_time
    print('craig deque no convert:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        RahulKP_numpy(l) # l changed in place
    elapsed_time = time() - start_time
    print('Rahul K P numpy:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        res = Divakar_pandas(l)
    elapsed_time = time() - start_time
    print('Divakar pandas:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        res = Nehal_pandas(l)
    elapsed_time = time() - start_time
    print('Nehal pandas:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

    lists = deepcopy(test_lists)
    start_time = time()
    for l in lists:
        res = Merlin_pandas(l)
    elapsed_time = time() - start_time
    print('Merlin pandas:'.ljust(25), '%.2f' % (number_of_lists / elapsed_time), 'lists per second')

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

辞書の辞書でリストの長さの合計を見つける方法は?

分類Dev

辞書のリスト内のアイテムを見つける

分類Dev

このMYSQLクエリで合計と累積カウントを見つける方法はありますか?

分類Dev

Reactのアイテムのリストから合計価格を見つける方法は?

分類Dev

合計が与えられた値に等しいサブアレイを見つけるための累積合計

分類Dev

タプルの2つのリストで上位n個の重複アイテムを見つける方法(Python)

分類Dev

どのように私はPythonでネストされた辞書内のアイテムの最大値を見つけるのですか?

分類Dev

豚のスクリプト:グループ内のアイテムの合計を見つける

分類Dev

Pythonで辞書の2つのリストの違いを見つける

分類Dev

Pythonで辞書の2つのリストの違いを見つける

分類Dev

累積合計が大きくなる配列内のインデックスを見つけるための高速で厄介な方法はありますか?

分類Dev

Pythonでアイテムの2つのリストを互いに合計する最速の方法

分類Dev

辞書のリストのリストで辞書の一般的な出現を見つける方法

分類Dev

辞書内のリストの最大値を見つける方法

分類Dev

gitリポジトリでコミットされたファイルの累積数を見つける方法

分類Dev

リストビューでアイテムの位置を見つける方法

分類Dev

csvファイルからデータを読み取りながらリストの累積合計を見つける

分類Dev

辞書Pythonのリストの違いを見つける

分類Dev

リストの辞書を見つけて置き換えるPythonの方法

分類Dev

Pythonでforループを使用して2つのリストアイテムの積を合計するにはどうすればよいですか?

分類Dev

Pythonの辞書オブジェクトのリストで特定のキーを見つける方法

分類Dev

完成したアイテムの合計の長さを見つける方法は?

分類Dev

パンダ:各列の各タイムスタンプでの非NaNレコードの累積合計を見つけます

分類Dev

Pythonリスト内のアイテムのインデックスを見つける最速の方法

分類Dev

リスト内の辞書キー値のインデックスを見つける方法は?(python)

分類Dev

Pythonで異なるネストの辞書とリストを比較し、交差点を見つける方法は?

分類Dev

ネストされた辞書でゼロ以外の個々の値の合計を見つける

分類Dev

ペアワイズ積の最大合計を見つける

分類Dev

辞書のリストでインデックスを見つける

Related 関連記事

  1. 1

    辞書の辞書でリストの長さの合計を見つける方法は?

  2. 2

    辞書のリスト内のアイテムを見つける

  3. 3

    このMYSQLクエリで合計と累積カウントを見つける方法はありますか?

  4. 4

    Reactのアイテムのリストから合計価格を見つける方法は?

  5. 5

    合計が与えられた値に等しいサブアレイを見つけるための累積合計

  6. 6

    タプルの2つのリストで上位n個の重複アイテムを見つける方法(Python)

  7. 7

    どのように私はPythonでネストされた辞書内のアイテムの最大値を見つけるのですか?

  8. 8

    豚のスクリプト:グループ内のアイテムの合計を見つける

  9. 9

    Pythonで辞書の2つのリストの違いを見つける

  10. 10

    Pythonで辞書の2つのリストの違いを見つける

  11. 11

    累積合計が大きくなる配列内のインデックスを見つけるための高速で厄介な方法はありますか?

  12. 12

    Pythonでアイテムの2つのリストを互いに合計する最速の方法

  13. 13

    辞書のリストのリストで辞書の一般的な出現を見つける方法

  14. 14

    辞書内のリストの最大値を見つける方法

  15. 15

    gitリポジトリでコミットされたファイルの累積数を見つける方法

  16. 16

    リストビューでアイテムの位置を見つける方法

  17. 17

    csvファイルからデータを読み取りながらリストの累積合計を見つける

  18. 18

    辞書Pythonのリストの違いを見つける

  19. 19

    リストの辞書を見つけて置き換えるPythonの方法

  20. 20

    Pythonでforループを使用して2つのリストアイテムの積を合計するにはどうすればよいですか?

  21. 21

    Pythonの辞書オブジェクトのリストで特定のキーを見つける方法

  22. 22

    完成したアイテムの合計の長さを見つける方法は?

  23. 23

    パンダ:各列の各タイムスタンプでの非NaNレコードの累積合計を見つけます

  24. 24

    Pythonリスト内のアイテムのインデックスを見つける最速の方法

  25. 25

    リスト内の辞書キー値のインデックスを見つける方法は?(python)

  26. 26

    Pythonで異なるネストの辞書とリストを比較し、交差点を見つける方法は?

  27. 27

    ネストされた辞書でゼロ以外の個々の値の合計を見つける

  28. 28

    ペアワイズ積の最大合計を見つける

  29. 29

    辞書のリストでインデックスを見つける

ホットタグ

アーカイブ