Створення нового словника в Python


454

Я хочу створити словник у Python. Однак усі приклади, які я бачу, - це створення словника зі списку тощо. ..

Як створити новий порожній словник у Python?

Відповіді:


661

Дзвінок dictбез параметрів

new_dict = dict()

або просто написати

new_dict = {}

39
Чи є різниця між dict () та {}? Або люди просто віддають перевагу одне над іншим?
Метт

52
@ Matt Очевидно, CPython 2.7 dict () повільніше (у 6 разів повільніше?), Дивіться: doughellmann.com/2012/11/… У будь-якому випадку я починаю віддавати перевагу синтаксису конструктора в будь-якому випадку, оскільки мені легше набирати та переміщувати код між диктами та функціями викликів.
Девід Уітон

16
Я підтверджую, що в 3 рази швидше використовувати {} ніж dict () у python 3.x
Алекс Азазель

8
Так, я отримую приблизно в 4 рази швидше пітон 3.6 для {}більш dict()і 5 разів для []більш list().
Майкл Холл

10
У переважній більшості випадків неважливо, чи потрібно це в шість разів більше часу, оскільки це все ще непомітно невелика кількість часу.
гіпегуман

247

Ви можете це зробити

x = {}
x['a'] = 1

107
+1 для наступного логічного питання про те, як додати до нього новий елемент
Метт Клейн

27

Знати, як написати попередньо встановлений словник, також корисно знати:

cmap =  {'US':'USA','GB':'Great Britain'}

# Explicitly:
# -----------
def cxlate(country):
    try:
        ret = cmap[country]
    except KeyError:
        ret = '?'
    return ret

present = 'US' # this one is in the dict
missing = 'RU' # this one is not

print cxlate(present) # == USA
print cxlate(missing) # == ?

# or, much more simply as suggested below:

print cmap.get(present,'?') # == USA
print cmap.get(missing,'?') # == ?

# with country codes, you might prefer to return the original on failure:

print cmap.get(present,present) # == USA
print cmap.get(missing,missing) # == RU

4
Гарна думка! Але я вважаю, що обставина cxlateробить вашу відповідь занадто ускладненою. Я просто збережу частину ініціалізації. ( cxlateСама надто складна. Ви могли просто return cmap.get(country, '?').)
Даніель Дарабос

Подумайте про використання docs.python.org/2/library/… замість того, щоб писати функцію перекладу або використовувати .get () скрізь.
Спарр

1
Можливо, я б, за винятком того, що документація для мене абсолютно непрозора - це жахливо. Я поняття не маю, що вони мені говорять чи чому я повинен це робити. І .get (), здається, робить саме правильно - плюс це надзвичайно гнучко. Я впевнений, що це нерозуміння з мого боку. Зважаючи на це, мої запитання: чому турбувати? Що тут зберігається, тут простіше, тут швидше тощо? Вигода - це саме те, що?
fyngyrz

1
Неспоріднене, але ви повинні явно ловити KeyErrorзамість голого, за винятком (що може спіймати речі, такі як KeyboardInterruptі SystemExit).
Арнав Борбора

Арнав, так, звичайно, ти маєш рацію. Відредаговано відповідно. Дякую!
fyngyrz


15
d = dict()

або

d = {}

або

import types
d = types.DictType.__new__(types.DictType, (), {})

Яка різниця між types.DictType.__new__(types.DictType, (), {})та справедливим{}

2
Для всіх, хто читає це: останнє "рішення" - це трохи жарт - ви можете використовувати його (принаймні, в python 2.x - не працюватиме в py3k), але ніхто з його власних думок ніколи не захотів би це зробити так ;-)
bruno desthuilliers


4
>>> dict.fromkeys(['a','b','c'],[1,2,3])


{'a': [1, 2, 3], 'b': [1, 2, 3], 'c': [1, 2, 3]}

у запитанні зазначено, що у словнику має бути новий порожній екземпляр
Wesam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.