Python 2D 列表切片

Posted

技术标签:

【中文标题】Python 2D 列表切片【英文标题】:Python 2D list slice 【发布时间】:2016-02-16 07:08:16 【问题描述】:

我环顾四周,找不到任何具体的东西,所以这里是:

我有一个列表列表:

S = [[3,4],[6,7],[10,12]]

我想将第 i 个索引元素的第 0 个索引添加到另一个列表的末尾:

R = [5,6,7]

通常我可以说一维列表:

R = R + S[i:]

并从第 i 个索引中获取所有元素,但我想要 2D S 的第 i 个索引的第 0 个索引。如果我们从 i = 1 开始,我最终会得到:

R = [5,6,7,6,10]

另外,我不想使用 for 循环我想要一个可以工作的列表切片方法(如果有的话),因为它需要在某个范围内。

【问题讨论】:

“因为它需要在一定范围内” - 你的意思是什么?目前尚不清楚 for 循环会违反哪些类型的边界,但切片不会违反。 如果您经常使用嵌套列表代替多维数组,请考虑使用numpy @user2357112 :我有示例代码使用一维方法,将 S[i:] 的切片部分添加到 R 的末尾,所以我假设使用类似的方法将保持所需的界限。另外,当我学习一些更简洁的 python 样式代码时,我想知道是否有办法做到这一点。 @jonrsharpe :这是只能使用内置库的作业的一部分,所以 numpy 已经出来了,否则我肯定会使用它。 @Roklobster 如果这是一个作业,你不应该自己做吗? 【参考方案1】:

你可以使用zip来转置矩阵:

>>> S
[[3, 4], [6, 7], [10, 12]]
>>> zip(*S)
[(3, 6, 10), (4, 7, 12)]

然后切片转置:

>>> j=0
>>> i=1
>>> zip(*S)[j][i:]
(6, 10)

元组是可迭代的,因此连接将与列表一起使用:

>>> R = [5,6,7]
>>> R+=zip(*S)[j][i:]
>>> R
[5, 6, 7, 6, 10]

【讨论】:

【参考方案2】:

正如@jonrsharpe 所说,numpy 会为您解决问题:

import numpy as np
# Create two arrays
S = np.asarray([[3,4],[6,7],[10,12]])
R = np.asarray([5, 6, 7])
# Slice the S array
i = 1
sliced_S = S[i:, 0]
# Concatenate the arrays
R = np.concatenate((R, sliced_S))

看看numpy 令人印象深刻的documentation 和indexing。

【讨论】:

正如我告诉@jonrsharpe,我只能使用内置库,因为它正在一个 cs 部门集群上进行测试,我不能确定 numpy 是否可用。 对于家庭作业,我们不倾向于提供解决方案,而是提供提示:看看zip 函数,尤其是***.com/a/17037588/1150961。 直到,我并没有像最佳实践那样真正寻找家庭作业解决方案,但这是一种可靠的方法。

以上是关于Python 2D 列表切片的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow通过(不同范围的2d)切片列表更改/分配矩阵元素值

带有 2D 切片的 numpy 视图

Python高级特性之---切片操作

python 列表切片赋值

Python 之列表切片的四大常用操作

Python中列表/字符串切片slice?