Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Python a využití rekurze

Zdar borci, mám jednoduchý úkol. Používám python 3.6 a za úkol máme seznam seznamů seznamů... a rekurzivě máme vypsat všechny prvky z tohoto seznamu. Bohužel nevím, jak na to.

Mám funkci, která mi vypíše postupně seznamy (result_all), ale při rekurzivním volání funkce se mi to samozřejmě přepíše na prázdný seznam a posléze se nově zaplňují hodnoty.


def recursive_count(nested_num_list):
    result_all = []  # globalni promenna
    if len(nested_num_list) != 0:
        for elem in range(len(nested_num_list)):
            #print(nested_num_list, nested_num_list[elem], elem) # kontrola
            if type(nested_num_list[elem]) == type([]):
                #print(nested_num_list, elem) # kontrola
                recursive_count(nested_num_list[elem])
            else:
                result_all.append(nested_num_list[elem])
        print('vysledek:', result_all)

    return result_all


print(recursive_count([2, 9, [2, 1, 13, 2], 8, [2, 6]]))
#recursive_count([[9, [7, 1, 13, 2], 8], [7, 6]])
#recursive_count([[9, [7, 1, 13, 2], 8], [2, 6]])
print(recursive_count([[5, [5, [1, 5], 5], 5], [5, 6]]))

Při tomto programu vyjde takovýto výsledek, přičemž result vypíše vždy jen poslední seznam.


vysledek: [2, 1, 13, 2]
vysledek: [2, 6]
vysledek: [2, 9, 8]
[2, 9, 8] // toto je result
vysledek: [1, 5]
vysledek: [5, 5]
vysledek: [5, 5]
vysledek: [5, 6]
vysledek: []
[] // toto je result

Nevíte prosím, kde mám chybu a jak to udělat, aby mi result vypsal všechny prvky ze seznamů? Díky moc.

Předmět Autor Datum
Sám sis přece odpověděl: ale při rekurzivním volání funkce se mi to samozřejmě přepíše na prázdný s…
Wikan 05.12.2018 13:42
Wikan
Problém je, že proměnnou musím prvně inicializovat a když to neudělám, pak se mi třeba všechna testo…
Vilak 05.12.2018 13:50
Vilak
No ale nemusíš to přece inicializovat uvnitř funkce. A nebo lépe, pokud bys to chtěl mít jako "pure"…
Wikan 05.12.2018 13:56
Wikan
Hmm, když z toho udělám globální proměnnou, tak se mi to pak spojí do jednoho seznamu všechno. Ovšem…
Vilak 05.12.2018 14:04
Vilak
No však jsem ti napsal i lepší variantu.
Wikan 05.12.2018 14:17
Wikan
V Pythonu nedělám, ale zkusil jsem něco takového: def flatten(array): def inner(array): if len(arra…
Wikan 05.12.2018 20:11
Wikan
A jo, dvě vnořené funkce do sebe. Thx. poslední
Vilak 06.12.2018 10:21
Vilak

Hmm, když z toho udělám globální proměnnou, tak se mi to pak spojí do jednoho seznamu všechno. Ovšem když ji pokaždé inicializuji na prázdný seznam před každým voláním, tak to funguje, ale přijde mi to hrozné znásilňování. Musí být lepší způsob.


def recursive_count(nested_num_list):
    if len(nested_num_list) != 0:
        for elem in range(len(nested_num_list)):
            #print(nested_num_list, nested_num_list[elem], elem) # kontrola
            if type(nested_num_list[elem]) == type([]):
                #print(nested_num_list, elem) # kontrola
                recursive_count(nested_num_list[elem])
            else:
                result_all.append(nested_num_list[elem])
        #print('vysledek:', result_all) # kontrola

    return result_all

result_all = []  # globalni promenna
print(recursive_count([2, 9, [2, 1, 13, 2], 8, [2, 6]]))
result_all = []  # globalni promenna
print(recursive_count([[9, [7, 1, 13, 2], 8], [7, 6]]))
result_all = []  # globalni promenna
print(recursive_count([[9, [7, 1, 13, 2], 8], [2, 6]]))
result_all = []  # globalni promenna
print(recursive_count([[5, [5, [1, 5], 5], 5], [5, 6]]))
result_all = []  # globalni promenna

výsledek:


[2, 9, 2, 1, 13, 2, 8, 2, 6]
[9, 7, 1, 13, 2, 8, 7, 6]
[9, 7, 1, 13, 2, 8, 2, 6]
[5, 5, 1, 5, 5, 5, 5, 6]

V Pythonu nedělám, ale zkusil jsem něco takového:

def flatten(array):
    def inner(array):
        if len(array) == 0:
            return
        
        for i in range(len(array)):
            item = array[i]
            if type(item) == type([]):
                inner(item)
            else:
                result.append(item)
                
    result = []
    inner(array)
    return result

print(flatten([2, 9, [2, 1, 13, 2], 8, [2, 6]]))
print(flatten([[9, [7, 1, 13, 2], 8], [2, 6]]))
print(flatten([[5, [5, [1, 5], 5], 5], [5, 6]]))

Zpět do poradny Odpovědět na původní otázku Nahoru