【问题标题】:Dictionary name from value stored in list/ tuple/ variable [duplicate]存储在列表/元组/变量中的值的字典名称[重复]
【发布时间】:2020-01-13 18:59:54
【问题描述】:

我有一个清单如下:

['ExampleName', ['1', 'some_value_1'], ['2', 'some_value_2']]

我正试图弄清楚如何编写函数或循环来获取列表的第一个元素并将其设置为字典名称。 所需的输出相当于:

ExampleName = {1:'some_value_1', 2:'some_value_2'}

目前尝试eval命令没有成功

【问题讨论】:

  • 如果你有几个这样的结构,你应该建立一个像{'ExampleName': {1:'some_value_1', 2:'some_value_2'}, 'SomeOtherName': {....}, ...}这样的字典。像你想要做的那样创建变量通常是个坏主意。
  • 不要这样做。不要使用动态变量,使用另一个容器,在这种情况下,可能是另一个dict

标签: python


【解决方案1】:

就像在 cmets 中所说,根据其他变量内容生成变量名称是一个非常糟糕的主意,您应该创建一个字典,如下所示:

example = ['ExampleName', ['1', 'some_value_1'], ['2', 'some_value_2']]

output = {
    example[0]: {element[0]: element[1] for element in example[1:]}
}
print(output)

>>> {'ExampleName': {'1': 'some_value_1', '2': 'some_value_2'}}


【讨论】:

  • dict(example[1:]) 可能是从对列表中构造字典的一种更简洁的方法。
  • @kaya3 太棒了!
【解决方案2】:

我不认为那样做是个好主意。使用exec 可能会导致一些潜在的安全风险。

无论如何,它完全符合您的目标:

example_list = ['ExampleName', ['1', 'some_value_1'], ['2', 'some_value_2']]

name, *key_value_pairs = example_list
dictionary = {int(key): value for key, value in key_value_pairs}
exec(f"{name} = {dictionary}")

Try it online!


另见:

【讨论】:

  • 确实,看起来与我在这种情况下要实现的目标完全一样。
  • @User0261 如果是,请将此答案标记为accepted
【解决方案3】:

注意:这不是一件好事,只是为了好玩。

您可以在运行时使用locals() 字典创建变量,例如:

>>> hello # this variable does not exist yet
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    hello
NameError: name 'hello' is not defined
>>> locals()['hello'] = 'world' # create new variable
>>> hello
'world'
>>> locals().pop('hello')  # delete variable
'world'
>>> hello
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    hello
NameError: name 'hello' is not defined
>>> 

现在通过了解这一点,您应该能够构建您想要的字典

【讨论】:

  • 不,locals() 正是您不应该使用的,即使您尝试动态创建变量,因为分配给locals() 不能保证实际影响本地命名空间。实际上,在 CPython 中,这locals() is globals() 时起作用,即当您在全局命名空间中时。它会在函数内部失败,例如
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多