Python 列表元素逐项条件递增
我搜索这个问题已经有一段时间了,基本上我想根据另一个列表的元素来有条件地增加一个元素列表的值...
我的代码如下,但有没有更好的方法呢?比如列表推导式、map函数之类的?
我觉得像 ~+= 这样的逐元素操作符会很好,但为什么这个提议被搁置了呢?
for i in range(1,len(s)):
if s[i]<s[0]:
s[i]+=p[i]
根据你们的一些好建议,我重新写了代码,变成了下面这样
i=s<s[0]
s[i]+=p[i]
而且 s 和 p 都是数组。
顺便说一下,我的一个代码在速度上还是比 matlab 慢了 5 倍。
4 个回答
1
看看这个StackOverflow的问题:
基本上,像这样:
[sum(a) for a in zip(*[s, p]) if a[0] < 0]
示例:
>>> [sum(a) for a in zip(*[[1, 2, 3], [10, 20, 30]]) if a[0] > 2]
[33]
为了更清楚,这里解释一下zip的作用:
>>> zip(*[[1, 2, 3], [4, 5, 6]])
[(1, 4), (2, 5), (3, 6)]
它把两个(或更多)列表合并成一个包含元组的列表。你可以对每个元组中的元素进行条件测试。
2
这里是一个简化版:
# 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]
这个假设是 len(s) <= len(p)
希望这能帮到你。如果有问题请告诉我。祝你好运。:-)
1
如果你不想创建一个新的数组,那么你可以考虑以下几种方法:
- 你提到的那个方法(不过根据你使用的Python版本,可能需要用xrange)。
- 使用Numpy数组来处理s和p。这样的话,如果s和p的长度相同,你可以像这样操作:
s[s<s[0]] += p[s<s[0]]
。 - 使用Cython来加速你提到的方法。