Возможно ли создать понимание словаря на Python (для ключей)?
Без понимания списка вы можете использовать что-то вроде этого:
l = [] for n inrange(1, 11): l.append(n)
Мы можем сократить это до понимания списка: l = [n for n in range(1, 11)].
Однако, допустим, я хочу присвоить ключам словаря одно и то же значение. Я могу сделать:
d = {} for n inrange(1, 11): d[n] = True# same value for each
Я пробовал это:
d = {} d[i for i inrange(1, 11)] = True
Однако я получаю SyntaxError на for.
Кроме того (мне не нужна эта часть, но просто интересно), можете ли вы присвоить ключам словаря несколько разных значений, например:
d = {} for n inrange(1, 11): d[n] = n
Возможно ли это с пониманием словаря?
d = {} d[i for i inrange(1, 11)] = [x for x inrange(1, 11)]
Это также вызывает SyntaxError на for.
Переведено автоматически
Ответ 1
В Python 2.7+ есть понимание словаря, но они работают не совсем так, как вы пытаетесь. Как и понимание списка, они создают новый словарь; вы не можете использовать их для добавления ключей к существующему словарю. Кроме того, вы должны указать ключи и значения, хотя, конечно, вы можете указать фиктивное значение, если хотите.
>>> d = {n: n**2for n inrange(5)} >>> print d {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Если вы хотите присвоить им всем значение True:
>>> d = {n: Truefor n inrange(5)} >>> print d {0: True, 1: True, 2: True, 3: True, 4: True}
То, о чем вы, кажется, просите, - это способ установить несколько ключей одновременно в существующем словаре. Для этого нет прямого ярлыка. Вы можете либо выполнить цикл, как вы уже показали, либо использовать понимание словаря для создания нового dict с новыми значениями, а затем выполнить oldDict.update(newDict) для объединения новых значений со старым dict.
Ответ 2
Вы можете использовать метод класса dict.fromkeys ...
Если вам на самом деле не нужно инициализировать все ключи, defaultdict также может быть полезно:
from collections import defaultdict d = defaultdict(True)
Чтобы ответить на вторую часть, понимание dict - это как раз то, что вам нужно:
{k: k for k inrange(10)}
Вероятно, вам не следует этого делать, но вы также могли бы создать подкласс dict который работает примерно так же, как defaultdict если вы переопределите __missing__:
Мне очень нравится комментарий @mgilson, поскольку, если у вас есть две итерации, одна из которых соответствует ключам, а другая - значениям, вы также можете сделать следующее.