Сравните две строки, включая повторяющиеся буквы?

Я пытаюсь написать функцию, которая принимает два пользовательских ввода: слово и максимальную длину. Функция читает из текстового файла (открывается ранее в программе), просматривает все слова, которые соответствуют максимальной заданной длине, и возвращает список слов из файла, который содержит все буквы в слове, которое пользователь дал , Вот мой код:

def comparison(): otherWord = input("Enter word: ") otherWord = list(otherWord) maxLength = input("What is the maximum length of the words you want: ") listOfWords = [] for line in file: line = line.rstrip() letterCount = 0 if len(line) <= int(maxLength): for letter in otherWord: if letter in line: letterCount += 1 if letterCount == len(otherLine): listOfWords.append(line) return listOfWords 

Этот код работает, но моя проблема заключается в том, что он не учитывает повторяющиеся буквы в словах, считанных из файла. Например, если я введу «GREEN» в качестве otherWord, тогда функция возвращает список слов, содержащих буквы G, R, E и N. Я бы хотел, чтобы он возвращал список, содержащий слова, содержащие 2 E. Я предполагаю, что мне также нужно будет немного подкорректировать с частью letterCount, поскольку дубликаты повлияют на это, но сейчас я больше заинтересован в распознавании дубликатов. Любая помощь приветствуется.

Вы можете использовать счетчик для otherWord , как это:

 >>> from collections import Counter >>> otherWord = 'GREEN' >>> otherWord = Counter(otherWord) >>> otherWord Counter({'E': 2, 'R': 1, 'N': 1, 'G': 1}) 

И тогда ваш чек может выглядеть так:

 if len(line) <= int(maxLength): match = True for l, c in counter.items(): if line.count(l) < c: match = False break if match: listOfWords.append(line) 

Вы также можете написать это без переменной соответствия, используя конструкцию Python for..else:

 if len(line) <= int(maxLength): for l, c in counter.items(): if line.count(l) < c: break else: listOfWords.append(line) 

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

Вы можете использовать collection.Counter, который также позволяет выполнять (многострочные) операции:

 In [1]: from collections import Counter In [2]: c = Counter('GREEN') In [3]: l = Counter('GGGRREEEENN') In [4]: c & l # find intersection Out[4]: Counter({'E': 2, 'R': 1, 'G': 1, 'N': 1}) In [5]: c & l == c # are all letters in "GREEN" present "GGGRREEEENN"? Out[5]: True In [6]: c == l # Or if you want, test for equality Out[6]: False 

Таким образом, ваша функция может стать чем-то вроде:

 def word_compare(inputword, wordlist, maxlenght): c = Counter(inputword) return [word for word in wordlist if maxlenght <= len(word) and c & Counter(word) == c]