Понимание словаря дает другой результат из цикла - PullRequest
0 голосов
/ 06 июня 2018

Цикл для проверки того, содержит ли рука слово в слове, работает так, как показано ниже.

hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}
word = 'hello'

extra_hand = hand.copy()

for letter in word: 
    extra_hand[letter] -= 1

>> extra_hand
{'h': 0, 'e': 0, 'l': 0, 'o': 0}

Затем я пытаюсь перейти к пониманию словаря.Это должно выглядеть так.

hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}
word = 'hello'
extra_hand = {letter:hand[letter] - 1 for letter in word}

>>extra_hand
{'h': 0, 'e': 0, 'l': 1, 'o': 0}

Как видите, результат другой, l равно 1, что неверно.Я подозреваю, что 'l' были получены из объекта словаря руки без мутации.Итак, он просто сделал 2-1 дважды и стал 1, а не 2-1 и 1-1.

Что мне нужно сделать, чтобы исправить словарь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Оба ваших метода не означают одно и то же.Если метод понимания словаря будет транслироваться в циклах, вы получите

hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}
word = 'hello'
extra_hand = {}
for letter in word:
    extra_hand[letter] = hand[letter] - 1

Таким образом, hand['l'] никогда не изменяется и, следовательно, оно все равно 2, когда цикл достигает второго l.Вот почему вы получаете значение 1 оба раза.

На мой взгляд, вариант цикла идеально подходит.

0 голосов
/ 06 июня 2018
extra_hand = {letter:hand[letter] - 1 for letter in word}

эквивалентно:

for letter in word: 
    extra_hand[letter] = hand[letter] - 1

А не:

for letter in word: 
    extra_hand[letter] -= 1

В первом случае extra_hand['l'] равно 1, а во втором случае, вы вычитаете 1 дважды (что дает 0).

0 голосов
/ 06 июня 2018

Словарь не может быть использован таким рекурсивным способом.Он не может постоянно обновлять элемент, так как word повторяется.

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

Вы можете считать, что понимание словаря повторяет цикл for ниже.Как и в цикле for, вы будете устанавливать значения, а не добавлять их к значению, ранее назначенному клавише.

for letter in word:
    extra_hand['letter'] = hand['letter'] - 1

Ваш цикл в порядке, и нет необходимости использовать словарное понимание.


В качестве альтернативы, если вы хотите рассчитать только ненулевые значения, вы можете использовать collections.Counter:

from collections import Counter

hand = {'h': 1, 'e': 1, 'l': 2, 'o': 1}
word = 'hello'
res = Counter(hand) - Counter(word)

# Counter()

hand = {'h': 1, 'e': 2, 'l': 2, 'o': 1}
word = 'hello'
res = Counter(hand) - Counter(word)

# Counter({'e': 1})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...