【问题标题】:Python 2D list slicePython 2D 列表切片
【发布时间】: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 如果这是一个作业,你不应该自己做吗?

标签: python list python-2.7 slice


【解决方案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 令人印象深刻的documentationindexing

    【讨论】:

    • 正如我告诉@jonrsharpe,我只能使用内置库,因为它正在一个 cs 部门集群上进行测试,我不能确定 numpy 是否可用。
    • 对于家庭作业,我们不倾向于提供解决方案,而是提供提示:看看zip 函数,尤其是stackoverflow.com/a/17037588/1150961
    • 直到,我并没有像最佳实践那样真正寻找家庭作业解决方案,但这是一种可靠的方法。
    猜你喜欢
    • 2017-06-24
    • 2015-02-19
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多