从MIT's OpenCourseWare 6.01SC开始练习。问题3.1.5:
定义一个函数
clip(lo, x, hi)
,如果lo
小于x
,则返回lo
;如果hi
大于{{,则返回x
1}},否则返回hi
。您可以假设x
。 ...不要使用lo < hi
,而要使用if
和min
。
用英语重新格式,如果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)
编辑:
对这个问题的评论/答案使我意识到,我原来的普通英语改写不是思考这个问题的好方法。考虑它的更好方法是确定其他两个参数之间是哪个。
答案 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
编辑:我不知道他为什么拒绝我的代码