Пролистать список со списком, используя функцию for - PullRequest
0 голосов
/ 19 июня 2019

В функции, которую я делаю, у меня есть цикл for x in range(y), который создаст список с глубиной списка x.

Например, при x=1, он создаст [[a,b],[a,b]]и на x=2 это создаст [[[a,b],[a,b]],[[a,b],[a,b]]]

Я хочу иметь возможность просматривать каждый элемент (каждый a и b), например, с x = 1 do:

for small_list in list:
    for element in small_list:
        print(element)

но мне трудно это понять, потому что при каждом различном значении x мне нужно будет изменить число операторов for.Есть ли способ изменить количество операторов for для моего списка на основе изменяющегося числа x, поскольку x линейно пропорционален количеству операторов, которые мне нужны?

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Есть ли способ изменить количество операторов ...

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

Вы, похоже, ищете какую-то функцию обхода дерева ; как то так:

def print_tree(tree):
    if isinstance(tree, list):
        for x in tree:
            print_tree(x)  # calling itself for smaller problem
    else:
        print(tree)        # base case

print_tree([[[1,2],[3,4]],[[5,6],[7,8]]])
1 голос
/ 19 июня 2019

В качестве альтернативы рекурсивной функции вы также можете пройти по структуре, сохраняя свой собственный стек:

def traverse(tree):
    stack = [tree]
    while stack:
        current = stack.pop()
        if isinstance(current, list):
            stack.extend(current[::-1])
        else:
            yield current

print(*traverse([[1, 2], [3, 4]]))
# 1 2 3 4
print(*traverse([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]))
# 1 2 3 4 5 6 7 8
1 голос
/ 19 июня 2019

Вы можете использовать одно-аргументное выражение, которое вызывается снова и снова, чтобы обернуть вашу итерацию:

def wrap_iter(x):
    return [x]

# then a function to recursively call f
def nums(f, x, rep):
    while rep:
        x = f(x)
        rep-=1
    return x

a = [[1,2], [1,2]]

nums(wrap_iter, a, 1)
[[[1, 2], [1, 2]]]

nums(wrap_iter, a, 0)
[[1, 2], [1, 2]]


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...