python - 如何将嵌套列表拆分为更小的嵌套列表
问题描述
所以我有一个嵌套列表作为我的输入(嵌套列表总是方形的。即与列相同的行数)。我想将此列表分解为另一个嵌套列表,其中的元素只是原始列表的 2x2“部分”。
例如,如果我的输入是
[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
我的输出应该是
[[1,2,5,6], [3,4,7,8], [9,10,13,14], [11,12,15,16]]
另一个例子:输入:
[[1,2,3],
[5,6,7],
[9,10,11],
输出:
[[1,2,5,6],[3,7],[9,10],[11]]
我尝试制作一个嵌套的 for 循环,该循环遍历前两列和行并将其放入一个列表中,然后将其附加到另一个列表,然后重复该过程,但我得到一个索引超出范围异常错误
这是我到目前为止所做的
def get_2_by_2(map: List[List[int]]) -> int:
i = 0
j = 0
lst_2d = []
lst = []
for row in range(i, min(i+2, len(map))):
for column in range(j, min(j+2, len(map))):
print(row,column)
lst.append(map[row][column])
lst_2d.append(lst)
return lst_2d
基本上这个只返回第一个 2x2。我尝试在外部使用 while 循环并增加 i 和 j 的值并使我的 while 循环依赖于其中之一。这导致索引超出范围。
解决方案
您可以以 2 的步长遍历行和列,并相应地对列表列表进行切片:
def get_2_by_2(matrix):
output = []
for row in range(0, len(matrix), 2):
for col in range(0, len(matrix[0]), 2):
output.append([i for r in matrix[row: row + 2] for i in r[col: col + 2]])
return output
或使用嵌套列表理解:
def get_2_by_2(matrix):
return [
[i for r in matrix[row: row + 2]
for i in r[col: col + 2]] for col in range(0, len(matrix[0]), 2)
]
所以给出:
m = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]]
get_2_by_2(m)
返回:
[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]
并给出:
m = [[1, 2, 3],
[5, 6, 7],
[9, 10, 11]]
get_2_by_2(m)
返回:
[[1, 2, 5, 6], [3, 7], [9, 10], [11]]
推荐阅读
- c++ - 计算数组中的特价商品
- python - Python Selenium:等待一个元素或另一个元素加载
- aws-lambda - 如何创建使用 S3Event 触发的 micronaut AWS Lambda 函数?
- node.js - 无法连接到 S3,在 Heroku Express/Node 应用程序上使用 Cloudcube 插件
- php - 如何在我的 json 的每一行中添加一个新值
- python - Python Selenium 抓取不正确的括号集(Python、Selenium、MySQL)
- php - 用于调试 PHP 的控制台(如 Firefox Web 控制台)在哪里?
- css - 仅当在无样式的 HTML 详细信息标签内时,表单元素样式不正确
- bash - 使用git时如何查找所有空文件夹和未跟踪的文件?
- javascript - 如何从 react-geosuggest 中提取邮政编码值?