Python:将列表中的负值设置为0

Python:将列表中的负值设置为0,python,matplotlib,Python,Matplotlib,这看起来很简单,但我在将列表中的负数设置为0时遇到了问题。这是我的密码: def subtract_lists(list1, list2): list3 = list() for i in range(0,len(list1)): list3.append(list1[i]-list2[i]) if i < 0: i = 0 else: i = i return list3 不

这看起来很简单,但我在将列表中的负数设置为0时遇到了问题。这是我的密码:

def subtract_lists(list1, list2):
    list3 = list()
    for i in range(0,len(list1)):
            list3.append(list1[i]-list2[i])
    if i < 0:
            i = 0
    else:
            i = i
    return list3

不过,我非常感谢所有的解决方案和帮助,我将尝试其他一些示例,以获得学习经验

您正在将
i
设置为零,而不是
list3[i]
的内容

if list3[i] < 0:
    list3[i] = 0
但是,我认为这样写函数会更清楚:

def subtract_lists(list1, list2):
    list3 = list()
    for i in range(0,len(list1)):
        list3.append(list1[i]-list2[i])
        if list3[i] < 0:
            list3[i] = 0
return list3
def subtract_lists(list1, list2):        
    list3 = []
    for a,b in zip(list1, list2):
        diff = a - b 
        list3.append(diff if diff > 0 else 0)
    return list3

当然还有更简洁的解决方案(请查看DrV的答案)。

一种方法是将列表更改为
numpy
数组。然后减法就简单明了了,另外,您还可以使用
numpy.clip
将负值更改为0
numpy
算术也比在python列表上迭代快得多(如果在本例中这是一个问题,这似乎不太可能)

import numpy as np

ar1 = np.array(list1)
ar2 = np.array(list2)

ar3 = np.clip(ar1 - ar2, 0, None)
如果您不想使用numpy,那么只需更改这一行即可

list3.append(list1[i] - list2[i])
对此

list3.append(max(list1[i] - list2[i], 0))
最后,当您迭代列表以生成新列表时,使用列表理解更符合python的习惯:

list3 = [max(item1 - item2, 0) for item1, item2 in zip(list1, list2)]
当然,如果列表的大小适中,那么您必须考虑到
zip
实际上是列表的副本。因此,如果使用
zip
时内存使用量过大,可以从
itertools
模块使用
izip
。对于
zip
,这只是一个替代品(在本例中):

from itertools import izip
list3 = [max(item1 - item2, 0) for item1, item2 in izip(list1, list2)]

zip
允许同时遍历两个列表,以便
li1
li2
是构成列表相同位置的列表项。在我看来,这是最具Python风格的方法,在这种情况下,如果我们有两个列表,这可能也是最快的方法。
max
处理负数,因为零大于
li1-li2
,并被放入
list3


jsw
给出的解决方案是一个很好的解决方案,但是从列表到
ndarray
(NumPy数组)的转换很慢。当然,NumPy不是(不幸的)标准Python发行版的一部分。

缩进也需要修复;检查需要在for循环的每次迭代中进行,而不是在循环完成后进行一次。“当然,NumPy不是(不幸的)标准Python发行版的一部分”:但是
NumPy
matplotlib
的一个依赖项,所以它可能是可用的。一个非常好的观点!!(我想我可能得去看眼科医生。)在这种情况下,NumPy的答案可能是最好的。
from itertools import izip
list3 = [max(item1 - item2, 0) for item1, item2 in izip(list1, list2)]
 list3 = []
 for i in range(len(list1)):
     list3.append(max(list1[i] - list2[i], 0))
 list3 = [ max(li1-li2, 0) for li1, li2 in zip(list1, list2) ]