логический компаратор строк зацикленных ключей

я делаю проект python и хочу сравнить строку со списком ключей и значений - если все ключи должны совпадать определенное количество раз со строкой слова, она должна возвращать, например, True - def compareTo(word, hand):

   kal = False 
   for d in wordlists: 
       if d in word: 
          kal = True 
   return kal

он всегда возвращает false, как я могу заставить его возвращать true?!? пожалуйста помоги!!!

so if

word = "hammer"

а также

hand =  {'a': 1, 'h': 1, 'r': 1, 'm': 2, 'e': 1}

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

comapreTo("hammer",{'a': 1, 'h': 1, 'r': 1, 'm': 2, 'e': 1})

должен возвращать True, а не False, а comapreTo("hammers",{'a': 1, 'h': 1, 'r': 1, 'd': 2, 'e': 1}) должен возвращать false, а не true!


person user2152315    schedule 09.03.2013    source источник


Ответы (2)


Вы можете просто использовать Counter для подсчета частот букв:

from collections import Counter

def compareTo(word, hand):
    return Counter(word) == hand

Например, Counter("hammer") равно Counter({'m': 2, 'a': 1, 'h': 1, 'r': 1, 'e': 1}); поскольку Counter подобен словарю, это будет равно {'a': 1, 'h': 1, 'r': 1, 'm': 2, 'e': 1}.

Counter встроен в Python 2.7 и Python 3.x. Если вам нужно использовать его в Python 2.6 или более ранней версии, вы можете получить его здесь: http://code.activestate.com/recipes/576611/.

person nneonneo    schedule 09.03.2013
comment
Хороший. Я бы добавил информацию о том, что Counter находится в Python с версии 2.7. В некоторых случаях это может стать препятствием для сделки... - person kkonrad; 10.03.2013

Это должно работать:

def compareTo(word, hand):
    d = hand.copy()
    for c in word:
        d[c] = d.get(c, 0) - 1
        if d[c] < 0:
            return False
    return True

word = "hammer"
hand =  {'a': 1, 'h': 1, 'r': 1, 'm': 2, 'e': 1}

print compareTo(word, hand)  # => True    
print compareTo("hammers", hand)  # => False
print compareTo("plum", {'f': 1, 'h': 1, 'k': 1, 'm': 1, 'l': 1, 'p': 1, 'u': 1, 'y': 1})  # => True
person kkonrad    schedule 09.03.2013
comment
почему в данном случае не работает - ››› слива = слива ››› слива = {'f': 1, 'h': 1, 'k': 1, 'm': 1, 'l' : 1, 'p': 1, 'u': 1, 'y': 1} ››› print compareTo(plum, pluma) False - person user2152315; 10.03.2013
comment
в каком случае не работает? Я получаю результаты, которые находятся в комментариях ... Если вы хотите, чтобы это работало, если hand является надмножеством минимального соответствия, чем последний return, должен быть просто return True - person kkonrad; 10.03.2013
comment
@user2152315 user2152315, чтобы он работал в вашем случае, вам нужно применить изменение из комментария выше. - person kkonrad; 10.03.2013
comment
в случае слива и {'f': 1, 'h': 1, 'k': 1, 'm': 1, 'l': 1, 'p': 1, 'u': 1, 'y ': 1} он возвращает False, когда должен возвращать True - person user2152315; 10.03.2013
comment
@user2152315 user2152315 Я бы порекомендовал изменить описание проблемы, чтобы усилить то, что числа в этих словах hand являются нижними границами, а не равными значениями. - person kkonrad; 10.03.2013
comment
так как бы мне сделать их более низкими границами, kkonrad? - person user2152315; 10.03.2013
comment
это не работает в том смысле, что некоторые значения неверны и неверны... - person user2152315; 10.03.2013
comment
некоторые комментарии возвращают False, когда они должны возвращать True... понимаете, о чем я? - person user2152315; 10.03.2013
comment
Только один пример возвращает False, который исходит из вашего определения проблемы, которое вы описали как должно возвращать False... - person kkonrad; 10.03.2013