迭代带有窗口的列表



假设我们有这个列表: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)]

最新更新