Як ініціалізувати дикт із ключами зі списку та порожнім значенням у Python?


251

Я хотів би отримати таке:

keys = [1,2,3]

до цього:

{1: None, 2: None, 3: None}

Чи є пітонічний спосіб це зробити?

Це некрасивий спосіб зробити це:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

Відповіді:


388

dict.fromkeys([1, 2, 3, 4])

Це насправді класний метод, тому він працює і для dict-підкласів (як collections.defaultdict). Необов'язковий другий аргумент вказує значення, яке потрібно використовувати для ключів (за замовчуванням до None.)


153
Будьте обережні з ініціалізацією чогось змінного: Якщо ви зателефонуєте, наприклад, dict.fromkeys([1, 2, 3], [])всі клавіші відображаються в одному списку, а змінивши одну, вони змінять їх усі.
charleslparker

8
{k:[] for k in [1, 2, 3]}Хоча ініціалізація все ще безпечна.
Азіз Альто

263

ніхто не піклувався дати рішення про розуміння дикту?

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

32
Я вважаю, це було підтримано 2,7
віт

21
Це приємно і не страждає від довідкового питання, на який приймається відповідь.
charleslparker

Це також дозволяє призначити значення за замовчуванням (наприклад False).
neverendingqs

Це найчистіший, найпітонічніший спосіб в ІМО Python3
Беде Константинідес,

4
Використання dict-comp також дозволяє значенню бути результатом виклику функції (яка, за бажанням, може бути передана ключем як аргумент) - так це дуже потужний механізм.
мартіно

56
dict.fromkeys(keys, None)

2
дивовижно, я хотів порожніх списків,dict.fromkeys(keys, [])
мюн

12
@muon Це майже точно не те, що ви хочете, дивіться коментар charleslparker .
gerrit

Працює у версії Python 2.6.6.
Майк Фінч

2
Будьте обережні: це ініціалізує дикт з усіма клавішами на одне ціле значення
Менді Барель,

16
>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])

Вихід:

{'a': [], 'c': [], 'b': [], 'd': []}

1
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Франческо Мензані

4
назва keyDictвводить в оману, оскільки перший рядок коду повертає a set, а не a dict.
Брайан Оуклі

10
d = {}
for i in keys:
    d[i] = None

1
Чому Python видаляє помилку типу TypeError: 'type' object is not iterable:?
FaCoffee

1
@FrancescoCastellani Тому що listце тип. Якщо у вас є щось подібне list = [], вищевказаний метод завжди буде вам однакову помилку
smac89

1

У багатьох робочих процесах, де ви хочете приєднати довільне / початкове значення для довільних ключів, вам не потрібно заздалегідь хешувати кожен ключ окремо. Можна використовувати collections.defaultdict. Наприклад:

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None

Це більш ефективно, це дозволяє економити необхідність хеш-пам'яті всіх ваших ключів при створенні. Більше того, defaultdictце підклас dict, тому зазвичай не потрібно перетворювати назад у звичайний словник.

Для робочих процесів, де вам потрібен контроль над допустимими ключами, ви можете використовувати dict.fromkeysвідповідно до прийнятої відповіді:

d = dict.fromkeys([1, 2, 3, 4])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.