分配给python中的不连续切片

时间:2011-06-22 11:30:23

标签: python matlab indexing variable-assignment slice

在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)

编辑:我使用字符串作为一个简单的例子,但是带有列表的解决方案(已经发布,哇)就是我想要的。感谢。

3 个答案:

答案 0 :(得分:6)

>>> 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],其中所有参数都是可选的。

答案 1 :(得分:1)

字符串在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

答案 2 :(得分:0)

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可以获得这个,所以你只需要为那些循环。