给定一个元素列表,如何创建一个任意大小的窗口,并从中心向左和向右提取n个元素?例如,给定:
l = ['This', 'document', 'is', 'the', 'second', 'document']
and a window = 2
如何提取以下子列表:
['document', 'is', 'the', 'second', 'document']
到目前为止,我试图:
middle = int((len(l)/2))
middle_element = l[middle]
middle_index = l.index(l[middle])
left_side = l[:middle_index]
right_side = l[middle_index:]
sublist = left_side+right_side
我的方法的问题是,它不适用于任何大小的任何列表。当我找到列表的中心时,我应该如何控制从左到右的滑动?
这里有一个方法来完成你的问题:
l = ['This', 'document', 'is', 'the', 'second', 'document']
window = 2
middle = int((len(l)/2))
sublist = l[max(0, middle - window):min(len(l), middle + window + 1)]
输出:
['document', 'is', 'the', 'second', 'document']
解释:
取一片l
开始middle - window
(但没有强制使用max()
)小于0。忽略边缘情况,这确保我们得到middle - window
,middle - window + 1
,…,middle - window + window
,它们是window + 1
列表项的总数(除了索引为middle
的项外,window
项在middle
的左侧)。我们的切片在middle + window + 1
结束(防止min()
超出范围,尽管从技术上讲,这不是必需的,因为切片可以容忍大于序列长度的范围结束值),除了上面已经考虑的项目外,还添加了middle + 1
,…middle + window
(而不是项目middle + window + 1
片符号不包括切范围)的结束为一个额外的数window
项右边的middle
指数。