2016-04-27 2 views
0

Я хочу, чтобы получить список вложенности с помощью питона, глядя любитPython список рекурсии

[[['a'],'a'],'a'] 

Итак, я написал функцию рекурсии, чтобы получить его.

def recursion(x,i): 
    x.append(list('spam')) 
    x=[x] 
    i-=1 
    print('i value is %d'%i) 
    print(x) 
    if i>0: 
     print('start new recursion!') 
     recursion(x,i) 
    print('callback x"s value:',x) 
    #return x 

Но, если я буду называть эту функцию как

x=[] 
recursion(x,4) 

Результат х является

[['s', 'p', 'a', 'm']] 

Я не понимаю, и я обнаружил, что эта функция, похоже, была прибудете правое значение x по стандарту,

i value is 3 
[[['s', 'p', 'a', 'm']]] 
start new recursion! 
i value is 2 
[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']]] 
start new recursion! 
i value is 1 
[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']]] 
start new recursion! 
i value is 0 
[[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']],  ['s', 'p', 'a', 'm']]] 
callback x"s value: [[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']]] 
callback x"s value: [[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']] 
callback x"s value: [[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']] 
callback x"s value: [[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']] 

Пожалуйста, расскажите мне, что случилось с x, и почему функция не возвращает значение x, которое я хотел. Спасибо большое и извиняюсь за мой плохой английский.

#

Спасибо за ваше все attention.the значение х, я хочу, чтобы это

[[[[[['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']], ['s', 'p', 'a', 'm']],  ['s', 'p', 'a', 'm']]] 

Мне жаль, что я пропустил это в первом посте.

+0

Ваш вопрос не ясен, потому что вы не показываете, что такое x, когда вы вызываете «рекурсия (x, 4)», и вы не укажете ожидаемый результат для этого случая. – wim

+0

Вы ожидаете получить '[[['s'], 'p'] , 'a'], 'm'] 'или:' '[[[' s ',' p ',' a ',' m '], [' s ',' p ',' a ',' m '], [' s ',' p ',' a ',' m '], [' s ',' p ', 'a', 'm']] ' –

+0

Во-первых, я ошибаюсь, что не показываю, что хочу. На самом деле, я хочу, чтобы это было [[['s', 'p' , 'a', 'm'], ['s', 'p', 'a', 'm'], ['s', 'p', 'a', 'm'], ['s' , 'p', 'a', 'm']], спасибо за внимание. –

ответ

1

Я не уверен, что вы хотите, чтобы это произошло, но вот что происходит:

def recursion(x,i): 
    x.append(list('spam')) 
    x=[x] 

Здесь х становится [['s','p','a','m']]. Но после этого это не меняется. Когда вы вызываете recursion(x,i) несколько строк позже, это не влияет на исходное значение x.

Возможно, если вы сделаете x = recursion(x,i), он даст вам то, что вы хотите, потому что x на самом деле будет изменяться на верхнем уровне.

+0

Большое вам спасибо, я знаю, почему это происходит. Но вы должны что-то пропустить, я обновил сообщение для значения x, которое я хочу. И я пытаюсь использовать ваш код для решения моей проблемы, я потерпел неудачу. Могу ли я спросить для рабочих кодов? Еще раз спасибо. –

2

Я также не уверен, что вы хотите, но если вы хотите разбить строку на свои символы и поместить их в вложенные списки, эта функция работает.

def recursion(l,s): 
    if s == "": 
     return l; 
    elif len(l) == 0: 
     nL = [s[0]] 
     return recursion(nL,s[1:]) 
    else: 
     nL = [l,s[0]] 
     return recursion(nL,s[1:]) 

Так, например

print recursion([],"spam") 

выведет

[[[['s'], 'p'], 'a'], 'm'] 
0

Я думаю, что вы могли бы быть смущены тем, что Python string ("спам" является строкой) во многих пути, эквивалентные Python list. Вы можете проиндексировать их, получить их len() и т. Д. В частности, почти все, что вы делаете в квадратных скобках, работает как для string, так и для list типов.

Ваш первый пример представляет собой однобайтовую строку [[['a'], 'a'], 'a'], но вы не даете нам каких-то ключевых деталей: какой вклад вы ожидали получить?

Например, вход может быть:

func('a', 3) 

Или может быть:

func('aaa') 

Или может быть:

func(['a'], 3) # or ,2) 

Или может быть:

func(['a', 'a', 'a']) 

Любой из них будет разумной отправной точкой для возвращаемого значения [[['a'], 'a'], 'a'].

Решение

Потому что ваш пример функция принимает второй параметр, i, я буду считать, что существует реальная потребность в нем. Итак, давайте идти с простейшим случае:

def func(lst, times): 
    """ 
    Given a list and a multiplier > 0, return a "nested" list with 
    the contents of the original list repeated (nested) that many 
    times: 

     Input: [a,b],2 
     Output: [[a,b],a,b] 
    """ 
    assert times > 0 
    if times == 1: 
     return lst[:] 
    else: 
     result = lst[:] 
     result.insert(0, func(lst, times-1)) 
     return result 

    for times in range(1,4): 
     print(func(['a', 'b'], times)) 

Alternate

Вот простой функции, которая не принимает список:

def func(content, times): 
    """ 
    Given content and a multiplier > 0, return a set of nested lists, 
    with the requested depth, each containing optionally any further 
    nested lists and the given content. 

     Input: 'content', 2 
     Output: [['content'], 'content'] 
    """ 
    assert(times > 0) 
    if times == 1: 
     result = [content] 
    else: 
     result = [func(content, times-1)] 
     result.append(content) 
    return result 

for times in range(1,4): 
    print(func('a', times)) 
Смежные вопросы