Удаление дубликатов из отдельных строк в списке - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь написать программу python, которая при наличии списка строк удалит дубликаты символов из отдельных строк списка. Моя работа на данный момент такова:

#program: removeduplicates.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-lst", nargs='+', type=str, required=True)
xyz = parser.parse_args()
duplist = xyz.lst

def duplicate_destoryer(duplist):
    finallist = []
    for word in duplist:
        x = set()
        list = []
        for ch in word:
            if ch not in x:
                set.add(ch)
                list.append(ch)
        finallist.append(list)

    return finallist


if __name__ == "__main__":
    print(duplicate_destoryer(duplist))

В моей командной строке я ввожу

python removeduplicates.py -lst aarrtt ddwwtt

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

art dwt

Код, который я написал, имеет логическое значение для меня, но я продолжаю получать сообщение об ошибке дескриптор 'add' для объектов 'set' не применим к объекту 'str' Это справедливо и все, но по мере дальнейшего исследования я чувствую, что все больше сталкиваюсь с примерами кода, где set.add () используется со строковыми объектами.

Может ли кто-нибудь указать мне правильное направление или сказать мне, что я здесь делаю неправильно?

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Проблема, как указано, заключается в том, что вы используете

set.add(ch)

И set ссылается на класс set, а не на экземпляр. Исправление для вашего кода будет выглядеть следующим образом:

x.add(ch)

Чтобы вы знали, что это можно сделать в одну строку за счет того, что код станет менее читабельным, и вы можете потерять порядок ввода символов:

>>> words = ["aarrtt", "ddwwtt"]
>>> ["".join(set(list(word))) for word in words]
['art', 'dwt']

Сначала мы преобразуем строку в список символов, приведя ее к списку. Затем мы удаляем повторяющиеся символы, приводящие список к набору, и затем преобразуем его обратно в строку, используя метод join. Мы делаем все это внутри списка понимания, перебирая каждую из входящих строк.

1 голос
/ 02 апреля 2020

Вы очень, очень близко. Просто нужно использовать следующее:

x.add(ch)

вместо:

set.add(ch)

Это будет выводить список списков в качестве вывода, а не список ожидаемых строк. Чтобы исправить это, вы можете сделать:

finallist.append(''.join(list))

вместо:

finallist.append(list)

Обратите внимание, что вы не должны использовать list для имени переменной. Это Python встроенный.

0 голосов
/ 02 апреля 2020

Здесь происходит две вещи:

  1. Вы не можете добавить к ' set ', поскольку ваш экземпляр set - ' x '. Поэтому вместо set.add (ch) замените его на x.add (ch)
  2. . Вы собираете свои выходные данные в список списков, а это не то, что вам нужно. Вместо этого вы должны составить список строк для сбора выходных данных.

Вот модифицированная версия с желаемым выводом:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-lst", nargs='+', type=str, required=True)
xyz = parser.parse_args()
duplist = xyz.lst

def duplicate_destoryer(duplist):
    finallist = []
    for word in duplist:
        x = set()
        output = ""
        for ch in word:
            if ch not in x:
                x.add(ch)
                output += ch
        finallist.append(output)

    return finallist


if __name__ == "__main__":
    print(duplicate_destoryer(duplist))
...