6

問題:

xがloより小さい場合にloを返すPython関数clip(lo、x、hi)を記述します。xがhiより大きい場合はhi。それ以外の場合はx。この問題では、lo<hiと見なすことができます。

この問題には条件文を使用しないでください。代わりに、組み込みのPython関数minおよびmaxを使用してください。この問題を開始する前に、minのドキュメントとmaxのドキュメントを読み、インタプリタでこれらの関数を少し試してみることをお勧めします。

この関数は3つの数値を受け取り、1つの数値を返します。

与えられたコード:

def clip(lo, x, hi):
    '''
    Takes in three numbers and returns a value based on the value of x.
    Returns:
     - lo, when x < lo
     - hi, when x > hi
     - x, otherwise
    '''

追加された私のコード:

def clip(lo, x, hi):
    '''
    Takes in three numbers and returns a value based on the value of x.
    Returns:
     - lo, when x < lo
     - hi, when x > hi
     - x, otherwise
    '''
    if min(x, lo, hi) == x:
        return lo
    elif max(x, lo, hi) == x:
        return hi
    else:
        return x

ここに問題があります:私はどの条件も使用できません。ヘルプ!

4

10 に答える 10

9

これは、lo < hi であると仮定した場合の解決策です。

def clip(lo, x, hi):
    return max(lo, min(hi, x))

それぞれの場合の仕組み:

  • lo、x < lo の場合: lo < hiの場合、x < hi の場合、 min(hi, x)returnxおよびmax(lo, x)return lo.
  • こんにちは、x > hi の場合:min(hi, x)戻りhilo < hiの場合max(lo, hi)は戻りますhi
  • x、それ以外の場合: x > lo および x < hi なので、min(hi, x)戻り値xmax(lo, x)戻り値x
于 2013-02-16T20:02:48.630 に答える
8

そのため、これまでにいくつかのオプションが提案されています。まだ投稿されていないのは、ネストされた三項式です。

def clip(lo, x, hi):
    return lo if x <= lo else hi if x >= hi else x

しかし、これは明示的な条件付きテストを使用しているため、元の質問の解決策としてはおそらく適切ではありません。x <= loそれでも、これらのオプションを考えると、これは if (他のすべてのメソッドはすべての比較を評価し、1 つまたは 2 つのメソッド呼び出しを実行する)を短絡するという利点を実際に持つものです。timeit を使用してこれらの代替が実際にどのように実行されるかを見てみましょう (Python 3.3 でテストされているため、range はリストを作成しませんが、イテレータを返します)。

python -m timeit -s "lo,hi=10,90" "[max(lo,min(hi,x)) for x in range(100)]"
10000 loops, best of 3: 54.5 usec per loop

(評価ごとに 2 つの関数呼び出し、パフォーマンスが低下します)

python -m timeit -s "lo,hi=10,90" "[(lo,(hi,x)[x<hi])[x>lo] for x in range(100)]"
10000 loops, best of 3: 40.9 usec per loop

(両方のテストを評価し、評価ごとにタプルを構築しますが、少なくとも関数呼び出しは行いません)

python -m timeit -s "lo,hi=10,90" "[sorted((lo,x,hi))[1] for x in range(100)]"
10000 loops, best of 3: 90.5 usec per loop

(タプルとソートを構築します - 申し訳ありませんが、Gnibbler、これが最も遅いです)

python -m timeit -s "lo,hi=10,90" "[lo if x <= lo else hi if x >= hi else x for x in range(100)]"
100000 loops, best of 3: 18.9 usec per loop

(最速、関数呼び出しなし、のx >= hi場合のみ評価x > lo)

この短絡は、lo の値をテスト範囲のはるかに高い値に移動すると確認できます。

python -m timeit -s "lo,hi=80,90" "[lo if x <= lo else hi if x >= hi else x for x in range(100)]"
100000 loops, best of 3: 15.1 usec per loop

(これらを Python 2.x で再現したい場合は、 に置き換えrangexrangeください。)

于 2013-02-17T02:39:55.067 に答える
3

ソリューション全体を提供することなく、何も「チェック」する必要はありません。下から制限された値loは、実行から得られるものですmax(x, lo)

また、1 つの境界にクリッピングされた値は、他の境界にクリッピングされても影響を受けないため、1 つの修正の結果を別の修正に安全に適用できます。

于 2013-02-16T19:48:58.290 に答える
1

別の解決策:

def clip(lo, x, hi):
    result = {x: x}
    result[min(x, lo)] = lo
    result[max(x, hi)] = hi
    return result[x]
于 2013-02-16T20:16:30.393 に答える
0

これにより、条件演算子なしでうまくいきます。

max(lo,min(hi,x))
于 2015-07-08T21:55:53.913 に答える
0
def clip(lo, x, hi):
    return sorted((lo, x, hi))[1]
于 2013-02-16T20:10:03.520 に答える
0

分?最大?どうですか:

def clip(lo,x,hi):
    return (lo,(hi,x)[x<hi])[x>lo]
于 2013-02-17T02:25:56.607 に答える
-2

ここにも解決策があります: return min(max(x, lo), hi)

于 2015-01-19T18:21:57.863 に答える