Find Sum of list with condition

Find Sum of list with condition – StackOverflow

ifを使わない方法と云えば,numpyを使うしか思い付かない.

import numpy as np

L_np = np.array(L)
L_np.cumsum()[L_np.cumsum()<25][-1]

21

でも,この問題に対しては明らかにオーバーキル.

%%timeit
res = 0
for x in L:
    res += x
    if res > 25:
        res -= x
        break

878 ns ± 20.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%%timeit
L_np = np.array(L)
L_np.cumsum()[L_np.cumsum()<25][-1]

12.4 µs ± 665 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
 
 
 
ちなみに,reduceを使うよりは,

from itertools import accumulate

for x in accumulate(L):
    if x > 25:
        break
    res = x
res

21

%%timeit
for x in accumulate(L):
    if x > 25:
        break
    res = x

1.13 µs ± 18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%%timeit
reduce(lambda x, y: x + y if x + y <= 25 else x, L)

2.45 µs ± 123 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

reduceは下位互換性の為の名残であって,敢えて使う理由はない.

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中