Есть ли способ написать с меньшим "вложением"? - PullRequest
1 голос
/ 19 июня 2019

Проблема в задаче домашнего задания. Я думаю, что я решил это, но мне интересно, это лучшее решение? Проблема состоит в том, чтобы взять список и просмотреть его, чтобы увидеть, содержит ли он определенную подпоследовательность: 007. Здесь подпоследовательность используется в математическом смысле (поэтому 0110227 содержит , содержит 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 ]

4 голосов
/ 19 июня 2019

Начните с отмены вашего условия теста, чтобы вы могли просто вернуться рано.Последний тест вообще не требует оператора if, поскольку к этому моменту результатом условия является возвращаемое значение функции.

def spy_game(nums):
    if 0 not in nums:
        return False

    a_1 = nums.index(0)
    nums_1 = nums[a_1+1:]

    if 0 not in nums_1:
        return False

    a_2 = nums_1.index(0)
    return 7 in nums[a_2+1:]
2 голосов
/ 19 июня 2019

Лучше проектировать свои функции так, чтобы они не зависели от конкретного ввода.Например:

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])
2 голосов
/ 19 июня 2019

Если вы отмените условия включения, вы можете вернуться раньше, чем вводить дальнейшее вложение.

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:]

Вы также можете написать это, не создавая никаких копий списка, используя start параметр для метода index, который сообщит методу 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
0 голосов
/ 19 июня 2019

Ваш код скрывает то, что вы пытаетесь сделать.Попробуйте эту альтернативу.несмотря на то, что у него все еще есть 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
0 голосов
/ 19 июня 2019

Просто еще один вариант, лично я не вижу здесь проблемы с вложенностью.

Это сокращает его:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...