在Python中对不连续切片的赋值

2 投票
3 回答
855 浏览
提问于 2025-04-16 20:04

在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

撰写回答