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 ループを使用すると、この場合はラムダをマップするよりも高速だと思います。かなり大きなリスト(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 

マップ ラムダの使用。

別の選択肢は -

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 に答える