изменение исходного списка внутри функции - PullRequest
0 голосов
/ 22 ноября 2018

необходимо создать одну функцию, которая однажды удалит дубликаты, не изменяя первоначальный список.а во втором он должен изменить исходный список и ничего не возвращать.проблема здесь в том, что вторая функция просто работает с одним повтором и не работает с 2 разными числами (она просто удаляет одно число (она не работает с [2,3,4,5,3,4], но работает [1,2,3,3]

def drop_duplicates(lst):
    s = []
    # Write the rest of the code for question 3a below here.
    for i in lst:
       if i not in s:
           s.append(i)
    return s
lst = [1, 2, 3, 2, 4, 2]
print drop_duplicates(lst)
print lst

def drop_duplicates_in_place(lst):
    # Write the rest of the code for question 3b below here.
    for i in range(len(lst) - 1):
        for j in range ( i+1, len(lst) - 1):
            if lst[i] == lst[j]:
                lst.pop(j)
            else:
                continue

lst = [1, 2, 3, 2, 4, 2] 
print lst

1 Ответ

0 голосов
/ 22 ноября 2018

Слишком короткий диапазон внутреннего цикла:

for i in range(len(lst) - 1):
    for j in range(i+1, len(lst)):  # no -1 here

Более того, вам на самом деле не нужна часть else в теле вашего цикла.Как правило, вложенные циклы и повторное удаление из (середины) списка не идеальны с точки зрения производительности.Рекомендуемый способ удаления дубликатов при сохранении порядка появления в линейной форме - с помощью collections.OrderedDict.Чтобы сделать это на месте, вы можете использовать назначение среза:

from collections import OrderedDict

def drop_duplicates_in_place(lst):
    lst[:] = OrderedDict.fromkeys(lst)
...