9

我有一个值列表,我想将列表中任何元素的最大值设置为 255,将最小值设置为 0,同时保持范围内的值不变。

oldList = [266, 40, -15, 13]

newList = [255, 40, 0, 13]

目前我正在做

for i in range(len(oldList)):
    if oldList[i] > 255:
        oldList[i] = 255
    if oldList[i] < 0:
        oldList[i] = 0

或类似地与newList.append(oldList[i]).

但必须有比这更好的方法,对吧?

4

3 回答 3

18

用途minmax功能:

>>> min(266, 255)
255
>>> max(-15, 0)
0

>>> oldList = [266, 40, -15, 13]
>>> [max(min(x, 255), 0) for x in oldList]
[255, 40, 0, 13]
于 2013-11-12T06:45:40.407 回答
7

另一种选择是numpy.clip

>>> import numpy as np
>>> np.clip([266, 40, -15, 13], 0, 255)
array([255,  40,   0,  13])
于 2017-06-08T22:39:51.077 回答
2

您可以在 Python 中使用 map 和 lambda。例子:

newList= map(lambda y: max(0,min(255,y)), oldList)

如果它是多维列表,您甚至可以嵌套它们。例子:

can=map(lambda x: map(lambda y: max(0.0,min(10.0,y)), x), can)
can=[[max(min(u,10.0),0.0) for u in yy] for yy in can] 

但是我认为在这种情况下使用上面提到的 for 循环比 map lambda 更快。我在一个相当大的列表(200 万浮动)上试了一下,结果——

time python trial.py

real    0m14.060s
user    0m10.542s
sys     0m0.594s

使用 for 和 -

time python trial.py

real    0m15.813s
user    0m12.243s
sys     0m0.627s 

使用地图 lambda。

另一种选择是-

newList=np.clip(oldList,0,255)

它对任何维度都很方便,而且速度非常快。

time python trial.py

real    0m10.750s
user    0m7.148s
sys     0m0.735s 
于 2016-07-02T19:16:40.400 回答