Python, сравнивающий словари - PullRequest
1 голос
/ 08 сентября 2010

уровень: начинающий

word= 'even' 
dict2 = {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2} 

я хочу знать, состоит ли слово полностью из букв в dict2 мой подход:

шаг 1: преобразовать слово в словарь (dict1)

step2:

for k in dict1.keys(): 
        if k in dict2: 
               if dict1[k] != dict2[k]: 
                   return False 
               return True 

добавив оператор print, я вижу, что это просто заканчивается слишком рано например как только будет выполнено первое условие ЕСЛИ, цикл завершится, и я не получу правильный ответ. я думаю, что это легко, но Google и Python Doc не вернули ничего хорошего подсказки, поэтому я пытаюсь здесь.

Спасибо, Баба

UPDATE

количество раз, когда каждая буква встречается в слове, должно быть меньше или равно числу раз, которое оно появляется в dict2. Таким образом, я гарантирую, что слово полностью состоит из элементов dict2.

for k in word.keys(): # word has ben converted to key already
    if k not in hand:
        return False
    elif k in hand:
      if word[k] > hand[k]:  
          return False
return True

Ответы [ 5 ]

4 голосов
/ 08 сентября 2010
>>> word= 'even'
>>> dict2 = {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2}
>>> set(word).issubset(set(dict2.keys()))
True
1 голос
/ 08 сентября 2010

Если вам это не нужно для чего-то другого, не беспокойтесь о создании dict1.Просто сделайте это:

for c in word:
    if c not in dict2:
        return False
return True

Конечно, вы также можете использовать set вместо dict для хранения букв.

0 голосов
/ 08 сентября 2010
>>> word = {'e':2, 'v':1, 'n':1}
>>> hand= {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2}
>>> all(k in hand and v <= hand[k] for k,v in word.items())
False

и теперь посмотрите истинный случай

>>> hand['e']+=1
>>> all(k in hand and v <= hand[k] for k,v in word.items())
True
0 голосов
/ 08 сентября 2010

Вы хотите возвращать true только после всех проверок, поэтому придерживайтесь его после цикла.Вот прямая модификация вашего кода:

for k in dict1.keys(): 
    if k in dict2: 
        if dict1[k] != dict2[k]: 
            return False 
return True 
0 голосов
/ 08 сентября 2010

в вашем коде, просто переместите «return True», чтобы выйти за пределы всех циклов.То есть, возвращайте true, только если ваши циклы завершены, не найдя несоответствующее значение.Трудно сказать, действительно ли это то, что вам нужно для вашего действительного кода, но перемещение «return True» исправляет логическую ошибку в опубликованном вами коде.

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