Python, сравнивающий словари

1

Уровень: новичок

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 

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

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

ОБНОВЛЕНИЕ

количество раз, которое каждая буква, содержащаяся в слове, должно быть меньше или равно числу раз, которое оно появляется в 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
  • 0
    Важны ли значения в dict2? Например, означает ли dict2['v']=2 что word может содержать не более 2 v s?
  • 0
    идея состоит в том, чтобы оценить, состоит ли слово полностью из букв в dict2. так что если слово содержит 2 e (например, 'even'), то если dict2 [e] = 1, функция возвращает False
Теги:
dictionary

5 ответов

0
Лучший ответ

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

for k in dict1.keys(): 
    if k in dict2: 
        if dict1[k] != dict2[k]: 
            return False 
return True 
  • 1
    Спасибо Зубину и Брайану за указание на правильное использование функций возврата! Это было только освежение, в котором я нуждался. Я обновил свой пост сейчас с тем, что я считаю, код, который мне нужно было написать.
4
>>> word= 'even'
>>> dict2 = {'i': 1, 'n': 1, 'e': 1, 'l': 2, 'v': 2}
>>> set(word).issubset(set(dict2.keys()))
True
  • 0
    Чтобы немного пояснить вышесказанное ... потому что вам не нужны отношения ключ-> значение, вам нужен список или набор (а не диктат). Так как порядок не имеет значения и явно требуется только один элемент каждого типа, набор является более подходящим. .keys() возвращает список, поэтому вы используете конструктор set (), чтобы превратить как слово, так и список ключей в наборы.
1

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

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

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

0
>>> 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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню