有什么办法可以减少“嵌套”的书写?

时间:2019-06-19 16:45:23

标签: python python-3.x list

问题是家庭作业问题。我想我已经解决了,但是我想知道这是最好的解决方案吗?问题在于获取一个列表并遍历整个列表以查看其是否包含特定的子序列:007。此处的子序列在数学上使用(因此0110227 does 包含007并返回True)。

def spy_game(nums):
    if 0 in nums:
        a_1=nums.index(0)
        nums_1=nums[a_1+1:]
        if 0 in nums_1:
            a_2=nums_1.index(0)
            if 7 in nums[a_2+1:]:
                return True 
            else:
                return False
        else:
            return False
    else: 
        return False

5 个答案:

答案 0 :(得分:4)

从否定测试条件开始,这样您就可以早日返回。最后的测试根本不需要args语句,因为到那时,条件的结果就是函数的返回值。

& {}

答案 1 :(得分:2)

如果您取消包含条件,则可以提早返回,而无需引入进一步的嵌套。

def spy_game(nums):
    if 0 not in nums:
        return False
    a_1 = nums.index(0)
    num_1 = nums[a_1+1:]
    if 0 not in nums_1:
        return False
    a_2 = nums_1.index(0)
    return 7 in nums_1[a_2+1:]

您还可以通过使用index方法的start参数,而无需创建列表的任何副本来编写此代码,该方法将告诉index方法开始搜索元素的索引。这段代码看起来有所不同,但是实现了相同的功能,可能更易于维护。

def spy_game(nums):
    try:
        start = 0
        for n in [0, 0, 7]:
            start = nums.index(n, start)
        return True
    except ValueError:
        return False

答案 2 :(得分:2)

设计功能最好使其不依赖于特定的输入。例如:

def contains_anywhere(s, search):
    i = 0
    for c in search:
        try:
            i = s.index(c, i) + 1
        except ValueError:
            return False
    return True

ok = contains_anywhere([0,1,1,0,2,2,7,2], [0,0,7])

答案 3 :(得分:0)

还有另一种选择,我个人认为这里的嵌套没有问题。

这正在缩短它:

def spy_game(nums):
    if 0 in nums:
        nums_1 = nums[nums.index(0)+1:]
        if 0 in nums_1:
            if 7 in nums[nums_1.index(0)+1:]:
                return True
    return False

输出:

>>> spy_game([1,0,7])
False
>>> spy_game([0,1,7])
False
>>> spy_game([1,0,1])
False
>>> spy_game([0,0,7])
True

答案 4 :(得分:0)

您的代码隐藏了您要执行的操作。试试这个替代方法。即使它仍然具有3个嵌套级别,也可以更清楚地知道它在做什么:

def spy_game(nums):
    search_for = [x for x in "007"]
    for n in nums:
        if not search_for:  # found everything we were looking for
            return True
        if n == search_for[0]:  # found the next item
            search_for.pop(0)
return False