Как я могу написать эти вложенные if заявления более элегантно? - PullRequest
1 голос
/ 23 января 2020

Я пишу python программу, которая удаляет повторяющиеся слова из файла. Слово определяется как любая последовательность символов без пробелов, и дубликат является дубликатом независимо от случая, поэтому: дубликаты, дубликаты, дубликаты, дубликаты являются дубликатами. Как это работает, я читаю в исходном файле и сохраняю его в виде списка строк. Затем я создаю новый пустой список и заполняю его по одному, проверяя, существует ли текущая строка в новом списке. Я сталкиваюсь с проблемами, когда пытаюсь реализовать преобразование регистра, которое проверяет все экземпляры указанного формата c. Я попытался переписать оператор if следующим образом:

 if elem and capital and title and lower not in uniqueList:

     uniqueList.append(elem)

Я также попытался написать его с помощью операторов или:

 if elem or capital or title or lower not in uniqueList:

     uniqueList.append(elem)

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

def remove_duplicates(self):

    """
    self.words is a class variable, which stores the original text as a list of strings    
    """

    uniqueList = []

    for elem in self.words: 

        capital = elem.upper()
        lower = elem.lower()
        title = elem.title()

        if elem == '\n':
            uniqueList.append(elem)

        else:

            if elem not in uniqueList:
                if capital not in uniqueList:
                    if title not in uniqueList:
                        if lower not in uniqueList:
                            uniqueList.append(elem)

    self.words = uniqueList

Можно ли как-нибудь написать эти вложенные операторы if более элегантно?

Ответы [ 2 ]

1 голос
/ 23 января 2020

Объедините тесты с and

if elem not in uniqueList and capital not in uniqueList and title not in uniqueList and lower not in uniqueList:

Вы также можете использовать операции над множествами:

if not set((elem, capital, title, lower)).isdisjoint(uniqueList):

Но вместо тестирования всех различных форм elem, это будет Проще быть, если вы просто поместите только строчные слова в self.words на первом месте.

и сделаете self.words a set вместо list, тогда дубликаты будут удалены автоматически.

0 голосов
/ 23 января 2020

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

content = "Hello john hello  hELLo my naMe Is JoHN"
words = content.split()
dictionary = {}
for word in words:
    if word.lower() not in dictionary:
        dictionary[word.lower()] = [word]
    else:
        dictionary[word.lower()].append(word)
print(dictionary)

# here we have dictionary: {'hello': ['Hello', 'hello', 'hELLo'], 'john': ['john', 'JoHN'], 'my': ['my'], 'name': ['naMe'], 'is': ['Is']}
# we want the value of the keys that their list contains a single element

uniqs = []
for key, value in dictionary.items():
    if len(value) == 1:
        uniqs.extend(value)
print(uniqs)
# will print ['my', 'naMe', 'Is']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...