Попытка удалить общие элементы в списке с помощью рекурсии - PullRequest
0 голосов
/ 14 января 2020

Мой код:

def shorter(lst):
    if len(lst) == 0:
        return []
    if lst[0] in lst[1:]:
        lst.remove(lst[0])
    shorter(lst[1:])
    return lst

print shorter(["c","g",1,"t",1])

Почему он печатает ["c","g",1,"t",1] вместо ["c","g","t",1]

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Для рекурсивного метода вы можете просто проверить указанный индекс c в том виде, в котором он у вас есть. Если мы удаляем текущий элемент, мы хотим остаться с тем же индексом, в противном случае мы хотим увеличить индекс на единицу. Базовый случай для этого - если мы смотрим на последний элемент в массиве или за его пределами, поскольку нам не нужно его проверять.

def shorter(lst, ind=0):
    if ind >= len(lst)-1: #Base Case
        return lst
    if lst[ind] in lst[ind+1:]:
        lst.pop(ind)
        return shorter(lst,ind)
    return shorter(lst, ind+1)
#Stuff to test the function
import random
x = [random.randint(1,10) for i in range(20)]
print(x)
x = shorter(x)
print(x)

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

import random
x = [random.randint(1,10) for i in range(20)]
print(x)
x = list(set(x)) #Converts to set and back to list
print(x)
1 голос
/ 14 января 2020

Возможное рекурсивное решение может быть:

def shorter(lst):
    if lst:
        if lst[0] in lst[1:]:
            prefix = []        # Skip repeated item.
        else:
            prefix = [lst[0]]  # Keep unique item.
        return prefix + shorter(lst[1:])
    else:
        return lst

Предыдущий код также можно сжать до:

def shorter(lst):
    if lst:
        return lst[0:(lst[0] not in lst[1:])] + shorter(lst[1:])
    else:
        return lst

, а тело функции также можно уменьшить до однострочного :

def shorter(lst):
    return (lst[0:(lst[0] not in lst[1:])] + shorter(lst[1:])) if lst else lst

или даже:

def shorter(lst):
    return lst and (lst[0:(lst[0] not in lst[1:])] + shorter(lst[1:]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...