Как бы я рекурсивно получить уникальные элементы из вложенных списков? - PullRequest
1 голос
/ 11 марта 2020

Итак, я - полный новичок в рекурсии.

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

def extract_unique_elements(lists):
    if isinstance(lists, int):
        return {lists}

    for i in set(lists):
        return extract_unique_elements({i})

Так что очевидно, что это даже не близко к работе. Если бы; однако, если передать вложенный список, он вернется следующим образом:

>>> extract_unique_elements([1,[2,1,[5,5,[2]]]]) 
{1,2,5}

>>> extract_unique_elements([a,[a,b,[c,b,[e]]]])
{a,b,c,e}

Ответы [ 3 ]

4 голосов
/ 11 марта 2020

Это один из способов сделать это:

result = set()
lists = [1,[2,1,[5,5,[2]]]]

def extract_unique_elements(lists, result):
    if isinstance(lists, list):
        for item in lists:
            extract_unique_elements(item, result)

    else:
        result.add(lists)

extract_unique_elements(lists, result)

result
# {1, 2, 5}
1 голос
/ 11 марта 2020

вы можете использовать:

def extract_unique_elements(lists):
    if isinstance(lists, int):
        return {lists}

    values = set()
    for i in lists:
        values.update(extract_unique_elements(i))

    return values

или:

def extract_unique_elements(lists):
    if isinstance(lists, int):
        return {lists}

    return {i for e in lists for i in extract_unique_elements(e)}

тестирование:

extract_unique_elements([1,[2,1,[5,5,[2]]]])
# {1, 2, 5}

если вы хотите более компактную версию, вы можете использовать:

def extract_unique_elements(lists):
    return {i for e in lists  for i in ([e] if isinstance(e, int) else extract_unique_elements(e))}
0 голосов
/ 11 марта 2020

Или

def myflatten(l):
    if type(l) != list:
        return([l])
    elif type(l) == list:
        if len(l) == 1:
            return(myflatten(l[0]))
        else:
            res = myflatten(l[0]) + myflatten(l[1:])
            return(res)

print(set(myflatten([1,[2,1,[5,5,[2]]]])))
#{1, 2, 5}

# OR (rectified):

def myflatten(l):
    if not isinstance(l, list):
        return [l]
    else:
        if len(l) == 1:
            return myflatten(l[0])
        else:
            res = myflatten(l[0]) + myflatten(l[1:])
            return res
...