开发者

Assignment to discontinuous slices in python

In Matlab I can do this:

s1 = 'abcdef'
s2 = 'uvwxyz'

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

s1 is now 'ubwdyf'

This is just an example of the general:

A(I) = B

Where A,B are vectors, I a vector of indices and B is the same length as I. (Im ignoring matrices for the moment).

What would be the pythonic equivalent of the general case in P开发者_如何学运维ython? Preferably it should also run on jython/ironpython (no numpy)

Edit: I used strings as a simple example but solutions with lists (as already posted, wow) are what I was looking for. Thanks.


>>> s1 = list('abcdef')
>>> s2 = list('uvwxyz')
>>> s1[0::2] = s2[0::2]
>>> s1
['u', 'b', 'w', 'd', 'y', 'f']
>>> ''.join(s1)
'ubwdyf'

The main differences are:

  • Strings are immutable in Python. You can use lists of characters instead though.
  • Indexing is 0-based in Python.
  • The slicing syntax is [start : stop : step] where all parameters are optional.


Strings are immutable in Python, so I will use lists in my examples.

You can assign to slices like this:

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

which will print

[0, 5, 2, 6, 4]

This will only work for slices with a constant increment. For the more general A[I] = B, you need to use a for loop:

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


NumPy arrays can be indexed with an arbitrary list, much as in 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])

and assignment:

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

Unfortunately, I don't think it is possible to get this without numpy, so you'd just need to loop for those.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜