合計値がターゲットとなる配列内連続要素をみつける

Sum of n number inside array is x number and create subset of result – StackOverflow

多分,累積和からターゲット値を引いて考えるのがリーズナブルチョイスなのかなと.

from itertools import combinations
import numpy as np


def findSeqSum(lst, N):
    for i, j in combinations(range(len(lst)), 2):
        if sum(lst[i:j]) == N:
            return lst[i:j]


def findSeqSum_np(lst, N):
    a = np.asarray(lst)
    m = np.triu(a.cumsum() - np.concatenate(([0], a))[:, None])
    if (m == N).any():
        s, e = (m == N).nonzero()
        return a[s[0]:e[0]+1]


def findSeqSum_np2(lst, t):
    a = np.asarray(lst)
    v = a.cumsum() - t
    if (v == 0).any():
        return a[:(v==0).argmax()+1]
    elif np.isin(v, a).any():
        e = np.flatnonzero(np.isin(v, a))[-1]
        s = (a==v[e]).argmax() + 1
        return a[s:e+1]


lst = [20, 6, 7, 8, 50]
for x in [21, 13, 50, 33]:
    print(x, findSeqSum(lst, x))

for x in [21, 13, 50, 33]:
    print(x, findSeqSum_np(lst, x))
    
for x in [21, 13, 50, 33]:
    print(x, findSeqSum_np2(lst, x))
21 [6, 7, 8]
13 [6, 7]
50 None
33 [20, 6, 7]
21 [6 7 8]
13 [6 7]
50 None
33 [20  6  7]
21 [6 7 8]
13 [6 7]
50 None
33 [20  6  7]
広告
カテゴリー: 未分類 パーマリンク

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください