如何查找最小长度为3的所有可能的连续且不重叠的子列表

时间:2019-05-26 04:40:00

标签: python python-3.x time-series data-science sublist

我实际上想要做的是在一些数据中拟合所有可能的直线,并通过测量其平均R平方找到最佳拟合线组。

我陷入困境的步骤是如何用一种足够的方法来获得所有那些可能的子列表,以便以后可以进行调整。这也是为什么我要最小长度为3的原因,因为每条穿过两点的线都具有完美的配合,而我不希望那样。

例如,我的第一次尝试是这样的:

x.forEach(item => console.log(item.name))

但是然后我遇到了下面的列表,长度为5,但它没有用。因此,预期的输出将只是列表:

def sub_lists(lst):
    lr = [lst[:i] for i in range(3,len(lst)-2)]
    rl = [lst[i:] for i in range(len(lst)-3,2,-1)]
    return [[lr[i], rl[-i-1]] for i in range(len(lr))]

>>> tst = [489, 495, 501, 506, 508, 514, 520, 522]
>>> sub_lists(tst)
[[[489, 495, 501], [506, 508, 514, 520, 522]],
[[489, 495, 501, 506], [508, 514, 520, 522]],
[[489, 495, 501, 506, 508], [514, 520, 522]]]

,当我有更大的数据长度(例如10)时,遵循相同的逻辑:

>>> tst = [489, 495, 501, 506, 508]
>>> sub_lists_revised(tst)
[489, 495, 501, 506, 508]

因此,总而言之,我想要的是一种通用方法,该方法将适用于甚至更多的数据,尽管我认为目前我确实不需要三重奏。

在拟合之后,我还添加了第一个示例中的数字:fig1fig2,  fig3

1 个答案:

答案 0 :(得分:1)

这是一种递归的方法。

第一个函数为长度为react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/ 的列表生成可能的切入点,并至少生成长度为3的子列表。

第二个只是产生子列表,并根据切入点进行切割。

两者都是生成器,因此,如果循环使用子列表,则一次生成一个子列表。这可能很有用,因为当您的数据变长时,可能的子列表数量可能会非常多。

n

一些测试:

def cut_points(n, already_cut=None):
    # The first cut point is at 0 
    if already_cut is None:
        already_cut = [0]

    # We can cut at all places between the last cut plus 3 
    # and the length minus 3, and yield recursively the solutions for each choice
    for i in range(already_cut[-1]+3, n-2):
        cuts = already_cut[:] + [i]
        yield from cut_points(n, cuts)

    # When we tried all cut points and reached the total length, we yield the cut points list 
    yield already_cut[:] + [n]


def all_possible_sublists(data):
    n = len(data)
    for cut in cut_points(n):
        yield [data[cut[i]:cut[i+1]] for i in range(len(cut)-1)]