问题
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:
- What you proposed (though you might want to use xrange depending on the python version)
- 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. - 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