2013-03-12 4 views
3

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

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, поскольку дубликаты повлияют на это, но сейчас я больше заинтересован в распознавании дубликатов. Любая помощь приветствуется.

ответ

2

Вы можете использовать счетчик для 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) 

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

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

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

+0

Спасибо за это, он отлично работает! Любопытно, есть ли способ создать словарь букв и их количество без необходимости импортировать что-то из модуля, такого как Counter? – mrdziuban

+0

Ничего, я понял это. Я разделил слово на буквы, а затем присваивал каждой букве счет в словаре, используя str.count(). Еще раз спасибо. – mrdziuban

+0

Последний вопрос на самом деле: зачем нужно строительство ... еще нужно? После выражения for я хотел бы просто сказать «if c <= line.count (l): listOfWords.append (строка)», но я столкнулся с той же проблемой, что и раньше. Почему это так? – mrdziuban

0

Вы можете использовать collections.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] 
Смежные вопросы