Удаление дубликатов ДЛЯ цикла python

#python #for-loop

#python #для-цикла

Вопрос:

Я пытаюсь написать функцию для удаления дубликатов в списке, используя цикл for в python. Это то, что у меня есть:

 [IN]:
L = [1, 1, "a", "b", 1, "a", "d"]
N = [ ]

def remove_dup(x):
    for x in range(len(L)):
        if L[x] not in N:
            N.append(x)
    return N
   
print(remove_dup(N))  
  

Моя проблема заключается в том, что вместо вывода [1, «a», «b», «d»] он возвращает это:

 [OUT]:

[1, 2, 3, 4, 5, 6]
  

Lol idk откуда идет. По крайней мере, он печатает список…. Может кто-нибудь помочь девушке и сказать мне, почему я получаю случайно сгенерированный список? Я попытался переключить кучу переменных при вызове моей функции.

Спасибо!

Комментарии:

1. измените N.append(x) на N.append(L[x]) . x является индексом списка L и L[x] является элементом

2. Или используйте set N = set(L) .

Ответ №1:

To N , вы добавляете x вместо L[x] .

Ответ №2:

Вы перебираете индексы, а не значения, а затем добавляете их в свой новый список. Вам нужно либо найти элемент, чтобы добавить его, либо просто выполнить итерацию по значениям напрямую — поскольку на самом деле индекс вам ни для чего не нужен, это будет более удобный и читаемый код.

Отдельно не рекомендуется использовать подобный глобальный список для возврата результатов, поскольку это вызовет проблемы при попытке использовать вашу функцию более одного раза. Вместо этого создайте список «return» внутри вашей функции. Кроме того, вы на самом деле не используете список, переданный в функцию (с именем x ) — вместо этого вы просто ищете значения в глобальном L списке. Что также вызовет проблемы, если вы попытаетесь использовать свою функцию с другим списком.

Итак, чтобы исправить все эти проблемы, и с именами переменных, отредактированными для удобства чтения:

 # Iterating over indices
def remove_dups(in_list):
    result = []
    for index in range(len(in_list)):
        if in_list[index] not in result:
            result.append(in_list[index])
    return result

# Or over values (more readable):
def remove_dups(in_list):
    result = []
    for item in in_list:
        if item not in result:
            result.append(item)
    return result
  

Наконец, использование in в списке — не лучший способ проверки на наличие дубликатов, поскольку он будет искать по всему списку каждый раз. Гораздо более удобный и эффективный способ сделать это — просто преобразовать его в a set и обратно:

 def remove_dups(in_list):
    return list(set(in_list))
  

С оговоркой, что это не сохранит элементы списка в их первоначальном порядке.

Ответ №3:

Вместо N.append(x) использования:

 N.append(L[x])
  

В вашем случае x это индекс, который изменяется от 0 до размера L минус один. Но вам нужны значения, которые могут быть взяты из L индекса x .

Ответ №4:

В дополнение к другим ответам об использовании L[x] , а не просто x вы могли бы сделать что-то подобное вместо этого:

 L = [1, 1, "a", "b", 1, "a", "d"]
N = [ ]

def remove_dup(x):
    for x in L:
        if x not in N:
            N.append(x)
    return N
   
print(remove_dup(N))
  

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

Комментарии:

1. Использование параметров x, L, N немного сбивает с толку.

2. @ack, согласен. На самом деле, x также сразу переопределяется, поэтому ответ цамана, вероятно, лучший