Как удалить повторяющиеся элементы из списка в python

#python-3.x #list

#python-3.x #Список

Вопрос:

Я хочу удалить повторяющиеся слова из текстового файла и записать новый файл. Я сначала сортирую W1.txt а затем пытается удалить повторяющиеся слова и поместить их в новый текстовый файл под названием W1.txt .

Однако мой код застревает, и вывода нет. Ошибки отладки не было.

 with open("W1.txt") as f2:
         W = sorted(word.strip(",") for line in f2 for word in line.split())
    
    newList = []
    for item in W:
        unique = True
        current = W.pop()  
    
    for string in W:
        if current in string:
           unique = False
    
        if unique:
           newList.append(current)  
    
           W.insert(0, current)
         
    with open('W.txt', 'w') as filehandle:
         for listitem in newList:
             filehandle.write('%sn' % listitem)
  

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

1. используйте dict и проверьте, есть ли там слово или нет.

Ответ №1:

РЕДАКТИРОВАТЬ: если вы хотите сохранить метод, который у вас есть, с присвоением уникальной переменной, вот код:

ТАКЖЕ БУДЬТЕ ОСТОРОЖНЫ С ОТСТУПОМ. Строка после оператора with содержит 4 пробела / 1 табуляцию, и после того, как вы закончите открывать файл, следующая строка не имеет отступов. То же самое с операторами for и if, после того, как вы закончите с циклом или условием, удалите отступ для следующей строки.

 with open("W1.txt") as f2:
    W = sorted(word.strip(",") for line in f2 for word in line.split())
    
newList = []
for item in W:
    unique = True
    current = W.pop()
    
    # you want to check if the current item is in newList not if it exists in W
    if current in newList:
        unique = False
    
    if unique:
        newList.append(current)  
    
        W.insert(0, current)
         
         
with open('W.txt', 'w') as filehandle:
    for listitem in newList:
        filehandle.write('%sn' % listitem)
  

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

Если вы хотите использовать циклы, используйте первый бит кода:

Что вы хотите сделать, это проверить, есть ли элемент уже в вашем новом списке. Если это так, вы пропускаете его, если это не так, вы добавляете к нему.

Что-то вроде этого:

 with open("W1.txt") as f2:
    W = sorted(word.strip(",") for line in f2 for word in line.split())
    
newList = []
for item in W:
    # check if the item that you are looping through is already in your list
    if item in newList:
        # if the item exists then skip to the next item
        continue
    else:
        # the item is not in your list so add it in
        newList.append(item)
    
with open('W.txt', 'w') as filehandle:
    for listitem in newList:
        filehandle.write('%sn' % listitem)
  

Если вам нужен более быстрый способ сделать это, существует встроенная функция set, которая удаляет все дубликаты и возвращает кортеж:

 with open("W1.txt") as f2:
    W = sorted(word.strip(",") for line in f2 for word in line.split())
    
remove_duplicates = set(W)
newList = list(remove_duplicates) # set returns a tuple and if you want a list use this

with open('W.txt', 'w') as filehandle:
    for listitem in newList:
        filehandle.write('%sn' % listitem)
  

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

1. Спасибо. Я новичок в Python, и это действительно полезно.