Используйте переменную в качестве имени ключа в словаре Python - PullRequest
0 голосов
/ 20 мая 2018

Это кажется излишним:

name = 'Isaiah'
myInfo = {
  'name': name
}

Существует ли более короткий идиоматичный способ сделать это, как в JavaScript:

myInfo = { name }

Редактировать : изменилимя переменной от dict до myInfo, поскольку dict является ключевым словом.

Ответы [ 3 ]

0 голосов
/ 20 мая 2018

В очень редком случае, когда вы пытаетесь сделать диктат из огромного и / или динамического подмножества локального, глобального или собственного пространства имен, вы можете сделать это, отфильтровав соответствующее пространство имен:

keys = set('name age height balance hoopiness'.split())
d = {key: value for (key, value) in locals().items()
     if key in keys}

Но, очевидно, это не стоит делать для простого случая.Самое короткое, что вы могли бы сделать, это было бы:

d = {key: value for (key, value) in locals().items() if key == 'name'}

… которое избегает повторения name, но очень, очень глупо.

Для простого создания диктата из одного или двухпеременные со статическими именами, вы просто должны быть явными:

d = {'name': name}
d = dict(name=name)
0 голосов
/ 25 мая 2019

Я пришел сегодня на ТА, потому что у меня был тот же вопрос.Должен сказать, я очень разочарован ответами!Я согласен с вами, что у этой избыточности должно быть идиоматическое решение.И это редкий случай, когда Javascript кажется более разумным, чем Python.Поэтому я хотел бы добавить два предложения.

Во-первых, просто сказать, что Абарнерт прав, что вы должны быть явными, если это только одна или две переменные.Я бы сказал, даже если это больше, явная конструкция обычно будет лучше.Но я думаю, что есть случаи, когда ярлыки допустимы.Например, у меня есть файл, который создает словари для отправки данных через запросы Python.Это все, что он делает.И в каждом случае я получаю словарь, в котором ключи совпадают с определенными мной переменными.Я думаю, что это будет пример файла, в котором допустимо использование ярлыков.

Во-первых, вы можете использовать встроенную функцию eval.Эту команду обычно избегают, но это тот случай, когда она может помочь, потому что она может взять строку, которая является именем переменной, и выложить значение переменной:

def main():
    #variables
    foo = "hello world"
    bar = 10
    baz = [1, 2, 3]

    # Build the dictionary:
    args = ("foo", "bar", "baz")
    dictionary = dict()
    for arg in args:
        dictionary[arg] = eval(arg)
    print(dictionary)


if __name__ == "__main__":
    main()

Попробуйте ее,Обратите внимание, что было бы трудно обернуть эту функциональность в некоторый класс или функцию из-за переменной области видимости.Даже использование словаря не удастся.Но если вы довольны добавлением трех строк в такую ​​функцию, это сработает.

Во-вторых, подумайте, можете ли вы присваивать значения переменным при создании словаря.Таким образом, вместо:

foo = 4+5
dictionary = dict(foo=foo)

Попробуйте:

dictionary = dict(
    foo=4+5
)

Если вам нужно использовать более ранние значения в более поздних вычислениях, сначала инициализируйте словарь, а затем объедините вычисления с назначением dict.:

dictionary = dict()
dictionary['foo'] = 4 + 5
dictionary['bar'] = dictionary['foo'] + 9

Что-то, что, я думаю, также может помочь в вышеупомянутом случае, это новый PEP, который позволяет вам назначать псевдонимы в расчете.Тот, что BDFL подал в отставку.Так что будем надеяться, что это скоро будет реализовано!

Наконец, просто быстрый комментарий к принятому ответу, тот факт, что Python уже использовал {} для обозначения set, не означает, что мы не можем создать эту функциональность (почему не <> или D () или что-то?).Просто мои 2 цента.Я думаю, что это необходимая функция.

0 голосов
/ 20 мая 2018

Нет, нет.Также маловероятно, что такой синтаксис когда-либо появится, так как конструкция

{name}

была зарезервирована для set литералов .

Другой альтернативой является использование dict конструктора :

d = dict(name=name)

PS, поскольку dict - это имя, определенное в модуле builtins, пожалуйста, сделайтене называйте ваши переменные как dict.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...