2016-03-03 4 views
0

Здесь мы пытаемся создать новый список, содержащий элементы из obj, если элементы имеют длину больше n. Мой код не передавал доктрину, поскольку он терпит неудачу в list_over («пять», 3); его отпечатки "[]", когда он должен печатать "[пять]". Однако учение прошло на других примерах докштрин. Но мне трудно это исправить. Может ли кто-нибудь помочь?Как рекурсивно реализовать следующий метод вложенного списка?

def list_over(obj, n): 
    """ 
    Return a list of strings of length greater than n in obj, or sublists of obj, if obj 
    is a list. Otherwise, if obj is a string return a list containing obj if obj has 
    length greater than n, otherwise an empty list. 

    @param str|list obj: possibly nested list of strings, or string 
    @param int n: non-negative integer 
    @rtype: list[str] 

    >>> list_over("five", 3) 
    ['five'] 
    >>> list_over("five", 4) 
    [] 
    >>> L = list_over(["one", "two", "three", "four"], 3) 
    >>> all([x in L for x in ["three", "four"]]) 
    True 
    >>> all([x in ["three", "four"] for x in L]) 
    True 
    """ 

    return [list_over(x, n) if isinstance(x,list) else x for x in obj if len(x)>n] 
+1

В начале, я бы рекомендовал Сломать очень сложный список вниз в строку по логическому потоку линии и посмотреть, ведет ли он себя таким же образом. Когда вы реструктурируете свой код таким образом, вы можете добавить строки 'print' для отладки вашего кода и убедиться, что каждый шаг делает то, что вы хотите. Вы можете снова объединить его в понимании в конце. –

+0

Не знаю, из строки docstring, если функция должна сгладить вложенный список или нет. В моем ответе я предположил, что это так, но это может быть неверным (это не распространяется на какие-либо из доктрин). – Blckknght

ответ

2

Я не думаю, что вы должны пытаться втиснуть в довольно сложную логику этой функции в списке понимание. Есть случаи, когда вы ошибаетесь (например, более глубоко вложенные списки и списки с менее чем n членами).

Вместо этого я предлагаю выписывая функцию, которая обрабатывает базовый случай, когда obj является строкой, и рекурсивный случай, когда это не так:

def list_over(obj, n): 
    if isinstance(obj, str): # base case 
     if len(obj) > n: 
      return [obj] 
     else: 
      return [] 

    result = [] 
    for item in obj: 
     result.extend(list_over(item, n)) # recursive case 
    return result 
Смежные вопросы