假设我们有这个列表:L =[1,2,3, 4, 5, 6, 7, 8 ... n]
我们想通过列表中的3个元素窗口得到这个结果:
l1=[1,2,3]
l2=[2,3,4]
l3=[3,4,5]
l4=[4,5,6]
l6=[5,6,7]
l7=[6,7,8]
…直到我们遍历数组,并且之前的每个数组都存储在最后一个数组中,所以我们以这个结尾:
final_array= [ [1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7],[6,7,8] ]
如何用lambda函数轻松地做到这一点?
解决这个问题最简单的方法是使用列表推导,正如Ch3steR在评论中指出的:
[L[i: i+window_size] for i in range(len(L) - len(L)%window_size)]
;相应地设置你的window_size。- - - - - -Ch3steR
至于如何使用lambda:您也可以使用lambda并将其应用于Ch3steR的解决方案:
L = list(range(20))
win_size = 4
# this is just "one kind of" indirection for the list comp to force
# usage of a lambda - does not make it more clear though
lmd = lambda data, pos, wins: data[pos: pos + wins]
print( [lmd(L, p, win_size) for p in range(len(L) - win_size + 1)])
从你的评论:
我试着用光标工作,有点迷路了
游标?你也可以用迭代器来做——但这需要更多的代码:
L = list(range(20))
win_size = 4
# generate iterators
iterators = [iter(L) for _ in range(win_size)]
# advance iterators: 0th points to 0th elem, 1st to the 1st elem, etc.
for pos, i in enumerate(iterators):
for _ in range(pos):
next(i)
# collect the values from the iterators - cut off when 1st iterator is exhausted
k = [ list(map(next, iterators)) for _ in range(len(L) - win_size + 1)]
print(k)
到达
[[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7],
[5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12],
[10, 11, 12, 13], [11, 12, 13, 14], [12, 13, 14, 15], [13, 14, 15, 16],
[14, 15, 16, 17], [15, 16, 17, 18], [16, 17, 18, 19]]
这是其中一种方法:
L =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
out = []
window_size = 3
if (window_size>len(L)):
print ('Window Size is more than the list size')
else:
for i in range(len(L)-window_size+1):
out.append(L[i:i+window_size])
print (out)
输出:
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]]
第三方软件包more_itertools
有一个名为windowed
的方便函数,它正是这样做的:
In [1]: import more_itertools
In [2]: list(more_itertools.windowed(range(1, 9), n=3))
Out[2]: [(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7), (6, 7, 8)]