Python:将列表中的负值设置为0
这看起来很简单,但我在将列表中的负数设置为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 不
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
将负值更改为0numpy
算术也比在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) ]