在Python中对不连续切片的赋值
在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中,类似的写法是什么呢?最好能在jython/ironpython上运行(不使用numpy)
编辑:我用字符串作为简单的例子,但我其实想要的是用列表的解决方案(已经有人发过了,太棒了)。谢谢。
3 个回答
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的话,是无法做到这一点的,所以你只能通过循环来实现。
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开始的。
- 切片的语法是
[开始 : 结束 : 步长]
,其中所有参数都是可选的。
1
在Python中,字符串是不可改变的,所以我在例子中会用列表。
你可以像这样给切片赋值:
a = range(5)
b = range(5, 7)
a[1::2] = b
print a
这段代码会输出:
[0, 5, 2, 6, 4]
这种方法只适用于增量是固定的切片。对于更一般的情况,比如 A[I] = B
,你需要使用一个循环:
for i, b in itertools.izip(I, B):
A[i] = b