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 列表切片的主要内容,如果未能解决你的问题,请参考以下文章