python list element wise conditional increment

落花浮王杯 提交于 2019-12-10 19:18:42

问题


I have been searching this for a while, basically I am trying to conditionally increment a list of element by another list, element-wise...

my code is following, but is there a better way to do it? list comprehension, map??

I think a element-wise operator like ~+= from http://www.python.org/dev/peps/pep-0225/ would be really good, but why is it deferred?

for i in range(1,len(s)):
        if s[i]<s[0]:
            s[i]+=p[i]

based on some good feedbacks from you guys I have recoded to the following

i=s<s[0]
s[i]+=p[i]

and s,p are both arrays.

p.s still slow than matlab 5 times for one of my code.


回答1:


If you don't want to create a new array, then your options are:

  1. What you proposed (though you might want to use xrange depending on the python version)
  2. Use Numpy arrays for s and p. Then you can do something like s[s<s[0]] += p[s<s[0]] if s and p are the same length.
  3. Use Cython to speed up what you've proposed.



回答2:


Here is a quick version:

# sample data
s = [10, 5, 20]
p = [2,2,2]

# As a one-liner.  (You could factor out the lambda)
s = map(lambda (si, pi): si + pi if si < s[0] else si, zip(s,p))

# s is now [10, 7, 20]

This assumes that len(s) <= len(p)

Hope this helps. Let me know. Good luck. :-)




回答3:


Check this SO question:

  • Merging/adding lists in Python

Basically, something like:

[sum(a) for a in zip(*[s, p]) if a[0] < 0]

Example:

>>> [sum(a) for a in zip(*[[1, 2, 3], [10, 20, 30]]) if a[0] > 2]
[33]

To clarify, here's what zip does:

>>> zip(*[[1, 2, 3], [4, 5, 6]])
[(1, 4), (2, 5), (3, 6)]

It concatenates two (or more) lists into a list of tuples. You can test for conditions on the elements of each of the tuples.




回答4:


s = [s[i]+p[i]*(s[i]<s[0]) for i in range(1,len(s))]


来源:https://stackoverflow.com/questions/4210938/python-list-element-wise-conditional-increment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!