Запрос на удаление дубликатов

Итак, мне нужно удалить пробелы и дублировать значения в списке (только числа). Вот мой код:

def eliminateDuplicates(lst):
    i=0
    while i<len(lst):
       while lst.count(lst[i])!=1:
            lst.remove(lst[i])
       i=i+1
    print(lst)


def main():
    a=input("Enter numbers: ")
    lst=list(a)
    while ' ' in lst:
        lst.remove(' ')
    eliminateDuplicates(lst)

main()

в то время как этот метод эффективен и работает, когда на входе говорят

Enter numbers: 1 2 3 4 5   3 2 1    1  22

На выходе получается

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

Мне нужно, чтобы моя программа распознавала 22 и 2 как разные элементы, чтобы не удалять последние 2 и 2 из 22. Есть предложения?

РЕДАКТИРОВАТЬ: Извините за двух авторов, которые уже дали мне ответы. Мне не разрешено использовать функцию set, и порядок не имеет значения.


person user2146234    schedule 15.03.2013    source источник
comment
Вам разрешено использовать dict или Counter?   -  person John La Rooy    schedule 15.03.2013
comment
Удаление из списка при его изменении — опасная игра. Создавать новый список эффективнее и безопаснее.   -  person John La Rooy    schedule 15.03.2013


Ответы (2)


Это не делает то, что вы думаете:

b="".join(a)  # doesn't do anything useful since `a` is already a string
lst=list(b)   # this is converting the string to a list of characters

Попробуйте это вместо этого:

lst = a.split()  # automatically cleans up the whitespace for you
print(list(set(lst)))

Превращение списка в набор и обратно — удобный способ удалить дубликаты. Это также довольно эффективно по сравнению с тем, как вы делаете это, сканируя list снова и снова.

Если вы действительно хотите сохранить функцию eliminateDuplicates, ее можно просто

def eliminate_duplicates(lst):
    return list(set(lst))

def main():
    a=input("Enter numbers: ")
    lst = a.split()               # split automatically cleans up the whitespace
    print(eliminate_duplicates(lst))

if __name__ == "__main__":
    main()

Редактировать: поскольку вам не разрешено использовать set, Collections — еще один довольно эффективный метод удаления дубликатов.

from collections import Counter
def eliminate_duplicates(lst):
    return list(Counter(lst))

Это не так эффективно, но все же намного лучше, чем два вложенных цикла.

from itertools import groupby
def eliminate_duplicates(lst):
    [k for k,g in groupby(sorted(lst))]
person John La Rooy    schedule 15.03.2013
comment
Спасибо вам обоим за эту работу, к сожалению, они дают тот же результат, что и моя утомительная программа цикла while. Спасибо за вашу помощь, хотя - person user2146234; 15.03.2013
comment
@ user2146234, вы все еще используете lst = list(a), вы должны использовать lst = a.split() - person John La Rooy; 15.03.2013
comment
Вау, ты совершенно прав! Это сразу решило мою проблему, спасибо миллион! - person user2146234; 15.03.2013

Имеет ли значение порядок? Если не привести его к набору, а затем вернуть обратно в список.

lst = [1,2,3,3,6,4,5,6, 3, 22]
lst2 = list(set(lst))

Кроме того, вам, вероятно, следует использовать lst = a.split(' '), а не присоединяться

def main():
    a=input("Enter numbers: ") # Input the numbers
    clean_a = a.strip(); #Cleans trailing white space.
    lst=list(set(clean_a.split(' '))) #Split into tokens, and remove duplicates
person aw4lly    schedule 15.03.2013