如何将if / elif / else替换为min()和max()?

时间:2020-10-22 23:43:41

标签: python if-statement max min

MIT's OpenCourseWare 6.01SC开始练习。问题3.1.5:

定义一个函数clip(lo, x, hi),如果lo小于x,则返回lo;如果hi大于{{,则返回x 1}},否则返回hi。您可以假设x。 ...不要使用lo < hi,而要使用ifmin

用英语重新格式,如果max是最少的参数,则返回x;如果lo是最大的参数,则返回x;否则,返回hi。因此:

x

也许我不能正确地理解问题,但是我完全不知道如何在不使用def clip(lo, x, hi): if min(lo, x, hi) == x: return lo elif max(lo, x, hi) == x: return hi else: return x 的情况下返回结果。如何修改函数以删除if / elif / else语句?

Link to original problem 3.1.5

Link to previous problem 3.1.4 (for context)

编辑:

对这个问题的评论/答案使我意识到,我原来的普通英语改写不是思考这个问题的好方法。考虑它的更好方法是确定其他两个参数之间是哪个。

3 个答案:

答案 0 :(得分:1)

一行代码:

#! python3.8

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

print(clip(1, 2, 3))
print(clip(2, 1, 3))
print(clip(1, 3, 2))

# Output
# 2
# 2
# 2

答案 1 :(得分:0)

您可以返回以下公式:

x + lo + hi - max(x, lo, hi) - min(x, lo, hi)

按案例争论:

情况1:

If min(lo, x, hi) = lo and max(lo, x, hi) = hi
  x + lo + hi - max(x, lo, hi) - min(x, lo, hi) ==> x + lo + hi - hi - lo ==> x

情况2:

If min(lo, x, hi) = lo and max(lo, x, hi) = x
  x + lo + hi - max(x, lo, hi) - min(x, lo, hi) ==> x + lo + hi - x - lo ==> hi

情况3:

If min(lo, x, hi) = x and max(lo, x, hi) = hi
  x + lo + hi - max(x, lo, hi) - min(x, lo, hi) ==> x + lo + hi - hi - x ==> lo

该公式将在所有可能的情况下返回预期答案。

答案 2 :(得分:-1)

在这里,您无需输入if-else即可进行值检查。虽然块只能运行一次,所以不会有冗余。

WITH cte_replace_tokens AS (

    -- The initial query dont join on merges neither on store because can be a free text 
    SELECT COALESCE(r.text, s.part_text) AS [final], CAST('' AS NVARCHAR) AS merge_field, s.id, 1 AS i, s.contract_id
    FROM statement s
    LEFT JOIN store r ON s.store_id = r.id
    
    UNION ALL
    
    -- We loop till the last merge field, output contains iteration to be able to keep the last record ( all fields updated )
    SELECT replace(r.final, m.merge_field, m.user_data) as [final], m.merge_field, r.id, r.i + 1 AS i, r.contract_id
    FROM cte_replace_tokens r
    INNER JOIN statement_merges m ON m.statement_id = r.id
    WHERE m.merge_field > r.merge_field AND r.final LIKE '%' + m.merge_field + '%'
    -- spare lost replacements by forcing only one merge_field per loop
    AND NOT EXISTS( SELECT mm.statement_id FROM statement_merges mm WHERE mm.statement_id = m.statement_id AND mm.merge_field > r.merge_field AND mm.merge_field < m.merge_field)
) 

select s.id, 
(select top 1 final from cte_replace_tokens t WHERE t.contract_id = s.contract_id AND t.id = s.id ORDER BY i DESC) as res
FROM statement s
where contract_id = 1

编辑:我不知道他为什么拒绝我的代码