将一个大数组拆分为具有重叠和特定长度的较小数组



我是一个编码新手,正在尝试用Python编写一些代码。以下是要求。

我有一个有15个元素的数组。

A = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

我想分成长度为7的重叠的较小数组。那是

l1 = [1,2,3,4,5,6,7]
l2 = [2,3,4,5,6,7,8]
l3 = [3,4,5,6,7,8,9]
etc till
l9 = [9,10,11,12,13,14,15]

如何做到这一点?

您可以在for循环中对列表进行切片:

>>> A = list(range(1, 16))
>>> for i in range(len(A) - 6):
...     print(A[i:i+7])
... 
[1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7, 8]
[3, 4, 5, 6, 7, 8, 9]
[4, 5, 6, 7, 8, 9, 10]
[5, 6, 7, 8, 9, 10, 11]
[6, 7, 8, 9, 10, 11, 12]
[7, 8, 9, 10, 11, 12, 13]
[8, 9, 10, 11, 12, 13, 14]
[9, 10, 11, 12, 13, 14, 15]

如果你想将子列表分配给各个变量,最好使用列表理解:

L1, L2, ..., L9 = [A[i:i+7] for i in range(len(A) - 6)]

这个小函数应该完全按照您的意愿执行,它还可以处理len(数组)不是较小数组长度的整数倍的情况。当然,您可以输入分割大小和重叠的扩展。

def split_overlap(array,size,overlap):
    result = []
    while True:
        if len(array) <= size:
            result.append(array)
            return result
        else:
            result.append(array[:size])
            array = array[size-overlap:]

如何使用:

array = list(range(10))
print split_overlap(array,4,2)
[[0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7], [6, 7, 8, 9]]
array = list(range(11))
print split_overlap(array,4,2)
[[0, 1, 2, 3], [2, 3, 4, 5], [4, 5, 6, 7], [6, 7, 8, 9], [8, 9, 10]]

您的具体案例:

A = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
split_overlap(A,7,6)
[[1, 2, 3, 4, 5, 6, 7],
 [2, 3, 4, 5, 6, 7, 8],
 [3, 4, 5, 6, 7, 8, 9],
 [4, 5, 6, 7, 8, 9, 10],
 [5, 6, 7, 8, 9, 10, 11],
 [6, 7, 8, 9, 10, 11, 12],
 [7, 8, 9, 10, 11, 12, 13],
 [8, 9, 10, 11, 12, 13, 14],
 [9, 10, 11, 12, 13, 14, 15]]

您可能会使用以下代码:

A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
start = range(len(A) + 1)
stop = start[7:]
L = [A[i:j] for i, j in zip(start, stop)]

演示:

In [340]: L
Out[340]: 
[[1, 2, 3, 4, 5, 6, 7],
 [2, 3, 4, 5, 6, 7, 8],
 [3, 4, 5, 6, 7, 8, 9],
 [4, 5, 6, 7, 8, 9, 10],
 [5, 6, 7, 8, 9, 10, 11],
 [6, 7, 8, 9, 10, 11, 12],
 [7, 8, 9, 10, 11, 12, 13],
 [8, 9, 10, 11, 12, 13, 14],
 [9, 10, 11, 12, 13, 14, 15]]

要访问单个列表,您只需要对L进行适当的索引

In [341]: L[0]  #first list
Out[341]: [1, 2, 3, 4, 5, 6, 7]
In [342]: L[1]  #second list
Out[342]: [2, 3, 4, 5, 6, 7, 8]
In [343]: L[-1]  #last list
Out[343]: [9, 10, 11, 12, 13, 14, 15]

使用slice来执行此操作。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
# a = [1, 2, 3, 4, 5, 6, 7]
LENGTH = 7
result = []
if len(a) < LENGTH:
    result.append(a[:])
else:
    for i in range(len(a)-LENGTH+1):
        result.append(a[i:i+LENGTH])
print result
# [[1, 2, 3, 4, 5, 6, 7], [2, 3, 4, 5, 6, 7, 8], [3, 4, 5, 6, 7, 8, 9], [4, 5, 6, 7, 8, 9, 10], [5, 6, 7, 8, 9, 10, 11], [6, 7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12, 13], [8, 9, 10, 11, 12, 13, 14], [9, 10, 11, 12, 13, 14, 15]]

发布自己解决问题的努力(代码)总是一种很好的做法。然而,你可以尝试我的解决方案,我希望它能有所帮助:

def overlap_split(array, split_length):
  for i in range(len(array) - split_length):
     print(array[i:i + (split_length + 1)])

如果你仔细观察,你会注意到我已经将@eugene的代码转换为一个可以重复使用的函数。如果您计划使用拆分,则必须将每个拆分存储在单独的数组中,即l1、l2。。。ln,如@eugene 所示

最新更新