猿问

缩短多个布尔运算以对两个排序列表进行排序

我编写了以下递归解决方案来合并两个列表:


基本情况是:


1) 断言两个列表都为空


2)断言只有一个列表不为空


3)减少大小写以删除元素


4) 递归情况


     def merge(l1, l2):

    """

    :rtype: List

    """

    global res 

    res = []

    #Base Cases 

    #1 assert  empty

    if len(l1) == 0 and len(l2) == 0: #

        return res 

    #2assert one not empty

    if len(l1) == 0 and len(l2) != 0:

        return res.extend(l2)

    if len(l1) != 0 and len(l2) = 0:

        return res.extend(l1)

    #3assert one element in both 

    if len(l1) = 1 and len(l2) = 1:

        if l1[0] < l2[0]:

            res.append(l1.pop())

            res.append(l2.pop())

        else:

            res.append(l2.pop())

            res.append(l1.pop())

        return res


    #4recur case

    else:

        return merge(l1, l2)      

至于#2 assert only one is not emtty,就麻烦了,

怎么能把逻辑讲的简洁明了呢?


斯蒂芬大帝
浏览 113回答 1
1回答

慕容708150

您可以通过使用all()/any()和列表推导式来缩短代码,而不用打扰单独的变量res:def merge(l1, l2)&nbsp; &nbsp; if not all(l1, l2):&nbsp; # triggers when either l1 or l2 is empty&nbsp; &nbsp; &nbsp; &nbsp; return l1 + l2&nbsp; &nbsp;# no reason not to just concatenate an empty list&nbsp; &nbsp; elif len(l1) == 1 and len(l2) == 1:&nbsp; &nbsp; &nbsp; &nbsp; # ternary if statement&nbsp; &nbsp; &nbsp; &nbsp; return [l1.pop(), l2.pop()] if l1[0] < l2[0] else [l2.pop(), l1.pop()]&nbsp; &nbsp; else:&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return merge(l1, l2)
随时随地看视频慕课网APP

相关分类

Python
我要回答