python - 如何从列表列表中选择元素的滑动窗口?
问题描述
假设我有以下列表:
x = [[1,2,3],[4,5,6],[7,8,9,10]]
我希望选择所有大小的“窗口”,例如n=4
,错开距离,例如d=2
:
[[1,2,3],[4]] # Starts at position `0`
[[3],[4,5,6]] # Starts at position `d`
[[5,6],[7,8]] # Starts at position `2d`
[[7,8,9,10]] # Starts at position `3d`
即我希望在窗口与子列表重叠的地方采用相交的“切片”。
我该怎么办?
解决方案
如果您预先计算一些索引,您可以使用虚拟单线重建任何窗口:
import itertools
import operator
def window(x, start, stop):
first = indices[start][0]
last = indices[stop-1][0]
return [
[x[i][j] for i, j in g] if k in (first, last) else x[k]
for k, g in itertools.groupby(
indices[start:stop],
key=operator.itemgetter(0))
]
def flat_len(x):
"""Return length of flattened list."""
return sum(len(sublist) for sublist in x)
n=4; d=2
x = [[1,2,3],[4,5,6],[7,8,9,10]]
indices = [(i, j) for i, sublist in enumerate(x) for j in range(len(sublist))]
for i in range(0,flat_len(x)-n+1,d):
print(window(x,i,i+n,indices))
>>> [[1, 2, 3], [4]]
>>> [[3], [4, 5, 6]]
>>> [[5, 6], [7, 8]]
推荐阅读
- python - 我在 django 管理站点中看不到对象的标题。只看这个:modelName object (2)
- postgresql - 给定一个州的 OSM 数据,找到它的面积
- android - 如何在 VideoView 控件或 android 的 MediaPlayer 中播放编码 HLS 流,不想使用其他库
- javascript - 可以在没有 await 关键字的情况下调用异步函数吗?如果我们在没有等待的情况下调用会发生什么?
- google-cloud-platform - GCE 在哪里存储元数据的启动脚本在 VM 中?
- c++ - 以内存为重点,在数组中查找 k 个最小/最大元素
- python - Spark:IllegalArgumentException:'不支持的类文件主要版本 55'
- php - Ajax 重载框架只工作一次
- flutter - 聚焦时将光标定位在 TextField 的末尾?
- node.js - ExpressJs 与 NodeJs 版本的兼容性