Варіанти створення словника¶
Літерал¶
Словник можна створити за допомогою літералу:
dict¶
Конструктор dict дозволяє створювати словник кількома способами.
Якщо всі ключі словника - рядки, можна використовувати такий варіант створення словника:
Другий варіант створення словника за допомогою dict:
In [4]: r1 = dict([('model', '4451'), ('ios', '15.4')])
In [5]: r1
Out[5]: {'model': '4451', 'ios': '15.4'}
dict.fromkeys¶
У ситуації, коли треба створити словник з відомими ключами, але поки що порожніми значеннями (або однаковими значеннями), дуже зручний метод fromkeys:
In [5]: d_keys = ['hostname', 'location', 'vendor', 'model', 'ios', 'ip']
In [6]: r1 = dict.fromkeys(d_keys)
In [7]: r1
Out[7]:
{'hostname': None,
'location': None,
'vendor': None,
'model': None,
'ios': None,
'ip': None}
За замовчуванням метод fromkeys підставляє значення None. Але можна вказувати і свій варіант значення:
In [8]: router_models = ['ISR2811', 'ISR2911', 'ISR2921', 'ASR9002']
In [9]: models_count = dict.fromkeys(router_models, 0)
In [10]: models_count
Out[10]: {'ISR2811': 0, 'ISR2911': 0, 'ISR2921': 0, 'ASR9002': 0}
Цей варіант створення словника підходить не для всіх випадків. Наприклад, при використанні змінного типу даних у значенні, буде створено посилання на один і той самий об'єкт:
In [10]: router_models = ['ISR2811', 'ISR2911', 'ISR2921', 'ASR9002']
In [11]: routers = dict.fromkeys(router_models, [])
...:
In [12]: routers
Out[12]: {'ISR2811': [], 'ISR2911': [], 'ISR2921': [], 'ASR9002': []}
In [13]: routers['ASR9002'].append('london_r1')
In [14]: routers
Out[14]:
{'ISR2811': ['london_r1'],
'ISR2911': ['london_r1'],
'ISR2921': ['london_r1'],
'ASR9002': ['london_r1']}
У цьому випадку кожен ключ посилається на той самий список. Тому при додаванні значення до одного зі списків оновлюються й інші.
Для такого випадку найкраще підходить генератор словника. Дивись розділ (FIX REF)