Создание словаря из повторяемого - PullRequest
11 голосов
/ 03 ноября 2010

Какой самый простой способ создать словарь из итерируемого и присвоить ему некоторое значение по умолчанию? Я попробовал:

>>> x = dict(zip(range(0, 10), range(0)))

Но это не работает, поскольку range (0) не является итеративным, поскольку я думал, что это не будет (но я все равно пытался!)

Итак, как мне это сделать? Если я сделаю:

>>> x = dict(zip(range(0, 10), 0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: zip argument #2 must support iteration

Это тоже не работает. Есть предложения?

Ответы [ 4 ]

18 голосов
/ 03 ноября 2010

В Python 3 Вы можете использовать понимание слова.

>>> {i:0 for i in range(0,10)}
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}

К счастью, это было перенесено в Python 2.7, так что это также доступно там.

16 голосов
/ 03 ноября 2010

Вам нужен метод dict.fromkeys, который делает именно то, что вы хотите.

Из документов:

fromkeys(...)
    dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.
    v defaults to None.

Итак, что вам нужно:

>>> x = dict.fromkeys(range(0, 10), 0)
>>> x
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
2 голосов
/ 03 ноября 2010

Вы можете рассмотреть возможность использования подкласса defaultdict из модуля collections стандартной библиотеки.Используя его, вам может даже не потребоваться повторять итерацию, так как ключи, связанные с указанным значением по умолчанию, будут создаваться при каждом первом обращении к ним.

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

from  collections import defaultdict

dflt_dict = defaultdict(lambda:42)

# depending on what you're doing this might not be necessary...
for k in xrange(0,10):
    dflt_dict[k]  # accessing any key adds it with the specified default value

print dflt_dict.items()
# [(0, 42), (1, 42), (2, 42), (3, 42), ... (6, 42), (7, 42), (8, 42), (9, 42)]
2 голосов
/ 03 ноября 2010

PulpFiction дает практический способ сделать это. Но для интереса вы можете заставить свое решение работать, используя itertools.repeat для повторяющихся 0.

x = dict(zip(range(0, 10), itertools.repeat(0)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...