Каков предпочтительный синтаксис для инициализации dict: фигурные фигуры скобки {} или функция dict()?
Я пытаюсь изучить Python, и я уделяю пристальное внимание общим стандартам кодирования. Это может показаться бессмысленным ничтожным вопросом, но я стараюсь сосредоточиться на лучших практиках, когда узнаю, поэтому мне не нужно отучивать "плохие" привычки.
Я вижу два общих метода для инициализации dict:
a = {
'a': 'value',
'another': 'value',
}
b = dict(
a='value',
another='value',
)
Что считается "более питоническим"? Что вы используете? Почему?
Ответы
Ответ 1
Фигурные скобки. Передача аргументов ключевых слов в dict()
, хотя во многих сценариях это прекрасно работает, может инициализировать карту, только если ключи являются действительными идентификаторами Python.
Это работает:
a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})
Это не сработает:
a = dict(import='trade', 1=7.8)
>> SyntaxError: invalid syntax ^
Ответ 2
Первые, фигурные скобки. В противном случае вы столкнетесь с проблемами согласованности с ключами, в которых есть нечетные символы, например =
.
# Works fine.
a = {
'a': 'value',
'b=c': 'value',
}
# Eeep! Breaks if trying to be consistent.
b = dict(
a='value',
b=c='value',
)
Ответ 3
Первая версия предпочтительнее:
- Он работает для всех типов ключей, поэтому вы можете, например, сказать
{1: 'one', 2: 'two'}
. Второй вариант работает только для (некоторых) строковых ключей. Использование различных видов синтаксиса в зависимости от типа ключей было бы ненужной несогласованностью.
-
Это быстрее:
$ python -m timeit "dict(a='value', another='value')"
1000000 loops, best of 3: 0.79 usec per loop
$ python -m timeit "{'a': 'value','another': 'value'}"
1000000 loops, best of 3: 0.305 usec per loop
- Если специальный синтаксис для словарных литералов не предназначен для использования, он, вероятно, не будет существовать.
Ответ 4
Я думаю, что первый вариант лучше, потому что вы собираетесь получить доступ к значениям как ['a'] или ['another']. Ключи в вашем словаре - это строки, и нет причин притворяться, что они не являются. Для меня синтаксис ключевых слов выглядит умным сначала, но неясным при втором взгляде. Это имеет смысл только для меня, если вы работаете с __dict__
, и ключевые слова станут атрибутами позже, что-то вроде этого.
Ответ 5
FYI, если вам нужно добавить атрибуты в словарь (вещи, которые прилагаются к словарю, но не являются одним из ключей), вам понадобится вторая форма. В этом случае вы можете инициализировать словарь с помощью клавиш, имеющих произвольные символы, по одному, например:
class mydict(dict): pass
a = mydict()
a["b=c"] = 'value'
a.test = False
Ответ 6
Я почти всегда использую фигурные скобки; однако в некоторых случаях, когда я пишу тесты, я делаю упаковку/распаковку ключевых слов, и в этих случаях dict() гораздо более удобен в обслуживании, поскольку мне не нужно менять:
a=1,
b=2,
в:
'a': 1,
'b': 2,
Это также помогает в некоторых обстоятельствах, когда, я думаю, я мог бы захотеть превратить его в именованный кортеж или экземпляр класса позже.
В самой реализации из-за моей одержимости оптимизацией, и когда я не вижу особого преимущества в обслуживании, я всегда предпочитаю фигурные скобки.
В тестах и реализации я бы никогда не использовал dict(), если есть вероятность, что ключи, добавленные тогда или в будущем, будут либо:
- Не всегда быть строкой
- Не только содержит цифры, буквы ASCII и подчеркивания
- Начните с целого числа (
dict(1foo=2)
вызывает SyntaxError)
Ответ 7
Иногда dict()
- хороший выбор:
a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))
mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'],
[random.randint(0,100) для x в диапазоне (0,7)]))