Можно ли создать словарь понимания на Python (для ключей)?
Без понимания списка вы можете использовать что-то вроде этого:
l = []
for n in range(1, 11):
l.append(n)
Мы можем сократить это до понимания списка l = [n for n in range(1, 11)]
.
Однако, скажем, я хочу установить ключи словаря на то же значение. Я могу сделать:
d = {}
for n in range(1, 11):
d[n] = True # same value for each
Я пробовал это:
d = {}
d[i for i in range(1, 11)] = True
Тем не менее, я получаю SyntaxError
на for
.
Кроме того (мне не нужна эта часть, но мне просто интересно), вы можете установить ключи словаря для набора различных значений, например так:
d = {}
for n in range(1, 11):
d[n] = n
Возможно ли это при понимании словаря?
d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]
Это также поднимает SyntaxError
на for
.
python
dictionary
list-comprehension
Rushy Panchal
источник
источник
Ответы:
Есть словарь в Python 2.7+ , но они работают не так, как вы. Подобно пониманию списка, они создают новый словарь; Вы не можете использовать их для добавления ключей в существующий словарь. Кроме того, вы должны указать ключи и значения, хотя, конечно, вы можете указать фиктивное значение, если хотите.
Если вы хотите установить их все в True:
То, что вы, кажется, просите, это способ установить несколько ключей одновременно в существующем словаре. Там нет прямого ярлыка для этого. Вы можете либо зациклить, как вы уже показали, или вы можете использовать словарное понимание, чтобы создать новый dict с новыми значениями, а затем сделать,
oldDict.update(newDict)
чтобы объединить новые значения в старый dict.источник
dict.update
также может принимать итерируемые пары ключ-значение, какdict
конструкторdict.fromkeys()
. Таким образом, чтобы установить все значенияTrue
, используйтеdict.fromkeys(range(5), True)
. Обратите внимание, что значение не копируется , поэтому вы можете избежать этого, когда у вас есть изменяемое значение; это будет разделено между всеми ключами.{ n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}
. Как можно сделать в одном выражении:{ n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
.Вы можете использовать
dict.fromkeys
метод класса ...Это самый быстрый способ создать словарь, в котором все ключи соответствуют одному значению.
Но ничего не использовать это с изменяемыми объектами :
Если вам на самом деле не нужно инициализировать все ключи,
defaultdict
может быть также полезен a :Чтобы ответить на вторую часть, вам нужно именно это понимание:
Вы, вероятно, не должны этого делать, но вы также можете создать подкласс,
dict
который работает как a,defaultdict
если вы переопределите__missing__
:источник
d = defaultdict(lambda: True)
, лямбда не требуется, так как True является (или не должен) быть изменяемым.источник
Мне очень нравится комментарий @mgilson, так как если у вас есть две итерируемые, одна из которых соответствует ключам, а другая значения, вы также можете сделать следующее.
дающий
источник
{i:j for i in keys for j in values}
Используйте dict () в списке кортежей, это решение позволит вам иметь произвольные значения в каждом списке, если они имеют одинаковую длину
источник
d = dict(zip(i_s,x_s))
Рассмотрим этот пример подсчета появления слов в списке с использованием словарного понимания.
И результат
источник
Основной целью понимания списка является создание нового списка на основе другого без изменения или уничтожения исходного списка.
Вместо того чтобы писать
или
ты должен писать только
В двух верхних блоках кода вы создаете новый список, просматриваете его и просто возвращаете каждый элемент. Это просто дорогой способ создания копии списка.
Чтобы получить новый словарь со всеми ключами, установленными на одно и то же значение, на основе другого dict, сделайте следующее:
Вы получаете SyntaxError, потому что когда вы пишете
Вы в основном говорите: «Установите мой ключ« i для i в диапазоне (1, 11) »в значение« Истина », а« i для i в диапазоне (1, 11) »не является допустимым ключом, это просто синтаксическая ошибка. Если dicts поддерживает списки в качестве ключей, вы должны сделать что-то вроде
и не
но списки не являются хэшируемыми, поэтому вы не можете использовать их в качестве ключей dict.
источник
Вы не можете хешировать такой список. попробуйте вместо этого, он использует кортежи
источник