将字典划分为变量

Phi*_*hil 23 python python-2.7

我正在学习Python,目前正在学习更多的词典.

我在想;

如果我有一个像这样的字典:d = {'key_1': 'value_a', 'key_2': 'value_b'}我希望将这个字典单独/分成变量,其中每个变量都是字典中的一个键,每个变量值都是字典中该键的值.

实现这一目标的最佳pythonic方法是什么?

d = {'key_1': 'value_a', 'key_2': 'value_b'}
#perform the command and get
key_1 = 'value_a'
key_2 = 'value_b'
Run Code Online (Sandbox Code Playgroud)

我试过了:key_1, key_2 = d但它不起作用.

基本上我正在寻求专家的智慧,以找出是否有更好的方法将2行代码减少为一行.

注意:这不是动态变量创建.

min*_*kin 24

现有的答案可行,但它们基本上都是重新实现Python标准库中已存在的函数: operator.itemgetter()

来自文档:

返回一个可调用对象,该对象使用操作数的__getitem __()方法从其操作数中获取项.如果指定了多个项,则返回一个查找值元组.例如:

在f = itemgetter(2)之后,调用f(r)返回r [2].

在g = itemgetter(2,5,3)之后,调用g(r)返回(r [2],r [5],r [3]).


换句话说,你的结构化dict赋值就像:

from operator import itemgetter

d = {'key_1': 'value_a', 'key_2': 'value_b'}
key_1, key_2 = itemgetter('key_1', 'key_2')(d)

# prints "Key 1: value_a, Key 2: value_b"
print("Key 1: {}, Key 2: {}".format(key_1, key_2))
Run Code Online (Sandbox Code Playgroud)


Sil*_*Ray 17

问题是dicts是无序的,所以你不能使用简单的解包d.values().您当然可以先按键对dict进行排序,然后解压缩值:

# Note: in python 3, items() functions as iteritems() did
#       in older versions of Python; use it instead
ds = sorted(d.iteritems())
name0, name1, name2..., namen = [v[1] for v in ds]
Run Code Online (Sandbox Code Playgroud)

你也可以,至少在一个对象中,做一些像:

for k, v in dict.iteritems():
    setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)

另外,正如我在上面的评论中提到的,如果您可以将需要解压缩字典的所有逻辑作为函数中的变量,您可以执行以下操作:

def func(**kwargs):
    # Do stuff with labeled args

func(**d)
Run Code Online (Sandbox Code Playgroud)


glg*_*lgl 17

以前没有提到过的解决方案

dictget = lambda d, *k: [d[i] for i in k]
Run Code Online (Sandbox Code Playgroud)

然后使用它:

key_1, key_2 = dictget(d, 'key_1', 'key_2')
Run Code Online (Sandbox Code Playgroud)

它的优点是即使需要检索更多变量,它仍然具有可读性.

然而,更具可读性的是"真实"功能,例如

def dictget(d, *k):
    """Get the values corresponding to the given keys in the provided dict."""
    return [d[i] for i in k]
    # or maybe
    return (d[i] for i in k) # if we suppose that we have bigger sets of result
    # or, equivalent to this
    for i in k:
        yield d[i]
Run Code Online (Sandbox Code Playgroud)

它也支持使用docstring进行注释,并且是首选.


Dar*_*mas 6

如果你有勇气,你可以做到这一点:

for k, v in d.items():
    locals()[k] = v
Run Code Online (Sandbox Code Playgroud)

但仅仅勇敢可能还不够——你可能还必须鲁莽等等。

如果你想成为像@ecatmur一样鲁莽的英雄,你可以这样做:

locals().update(d)
Run Code Online (Sandbox Code Playgroud)

但现在OP已经更新了他的问题并回答了评论,看来这并不是他真正想做的。仅供记录:动态创建变量有充分的理由 - 即使这里的每个人都同意它不是Pythonic。许多解释器风格的问题可以通过动态改变范围来解决。只需以受控的方式执行此操作即可。而且...呃,不要将其部署到某些生产站点;)

  • 顺便说一句,永远不要这样做 - 根据 http://docs.python.org/library/functions.html#locals *该字典的内容不应修改;更改可能不会影响解释器使用的局部变量和自由变量的值。* (5认同)

小智 6

var1, var2 = (lambda key1, key2: (key1, key2))(**d)
Run Code Online (Sandbox Code Playgroud)

如果您想让任何阅读您代码的人感到头疼,您可以使用匿名函数来解压这样的值。