【问题标题】:Assignment to discontinuous slices in python分配给python中的不连续切片
【发布时间】:2011-09-20 07:28:15
【问题描述】:

在 Matlab 中我可以这样做:

s1 = 'abcdef'
s2 = 'uvwxyz'

s1(1:2:end) = s2(1:2:end)

s1 is now 'ubwdyf'

这只是一般的例子:

A(I) = B

其中 A,B 是向量,I 是索引向量,B 与 I 长度相同。(我暂时忽略矩阵)。

Python 中一般情况的 Pythonic 等价物是什么?最好它也应该在 jython/ironpython 上运行(没有 numpy)

编辑:我使用字符串作为一个简单的示例,但我正在寻找带有列表的解决方案(如已发布的那样,哇)。谢谢。

【问题讨论】:

    标签: python matlab indexing variable-assignment slice


    【解决方案1】:

    NumPy 数组可以用任意列表索引,就像在 Matlab 中一样:

    >>> x = numpy.array(range(10)) * 2 + 5
    >>> x
    array([ 5,  7,  9, 11, 13, 15, 17, 19, 21, 23])
    >>> x[[1,6,4]]
    array([ 7, 17, 13])
    

    和分配:

    >>> x[[1,6,4]] = [0, 0, 0]
    >>> x
    array([ 5,  0,  9, 11,  0, 15,  0, 19, 21, 23])
    

    不幸的是,我认为没有 numpy 就不可能得到这个,所以你只需要循环这些。

    【讨论】:

      【解决方案2】:

      字符串在 Python 中是不可变的,因此我将在示例中使用列表。

      您可以像这样分配给切片:

      a = range(5)
      b = range(5, 7)
      a[1::2] = b
      print a
      

      将打印出来

      [0, 5, 2, 6, 4]
      

      这仅适用于具有恒定增量的切片。对于更通用的A[I] = B,需要使用for循环:

      for i, b in itertools.izip(I, B):
          A[i] = b
      

      【讨论】:

        【解决方案3】:
        >>> s1 = list('abcdef')
        >>> s2 = list('uvwxyz')
        >>> s1[0::2] = s2[0::2]
        >>> s1
        ['u', 'b', 'w', 'd', 'y', 'f']
        >>> ''.join(s1)
        'ubwdyf'
        

        主要区别在于:

        • 字符串在 Python 中是不可变的。不过,您可以改用字符列表。
        • 在 Python 中索引是从 0 开始的。
        • 切片语法为[start : stop : step],其中所有参数都是可选的。

        【讨论】:

        • 你不需要在列表中转换 s2...s1[0::2] = 'uvwxyz'[0::2] 也可以
        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 2020-01-15
        • 2022-01-25
        • 2016-01-15
        • 1970-01-01
        • 2022-08-09
        • 2017-08-09
        • 1970-01-01
        相关资源
        最近更新 更多