20

我正在寻找一种优雅的方法来将 Python dict 中的一些值提取到本地值中。

与此等效的东西,但对于更长的值列表和更长的键/变量名称更简洁:

d = { 'foo': 1, 'bar': 2, 'extra': 3 }
foo, bar = d['foo'], d['bar']

我最初希望得到类似以下的东西:

foo, bar = d.get_tuple('foo', 'bar')

我可以轻松编写一个不错的函数:

def get_selected_values(d, *args):
    return [d[arg] for arg in args]

foo, bar = get_selected_values(d, 'foo', 'bar')

但我一直在偷偷怀疑还有其他内置方式。

4

5 回答 5

33

你可以做类似的事情

foo, bar = map(d.get, ('foo', 'bar'))

或者

foo, bar = itemgetter('foo', 'bar')(d)

这可能会节省一些打字,但本质上与您正在做的事情相同(这是一件好事)。

于 2013-07-19T20:50:01.990 回答
2

有点可怕,但是:

globals().update((k, v) for k, v in d.iteritems() if k in ['foo', 'bar'])

请注意,虽然这是可能的 - 这是你真的不想做的事情,因为你会污染应该留在dict自身内部的命名空间......

于 2013-07-19T20:46:44.123 回答
2

好吧,如果你提前知道名字,你可以按照你的建议去做。

如果您不提前了解它们,请坚持使用 dict - 这就是它们的用途。

如果您坚持,另一种选择是:

varobj = object()
for k,v in d.iteritems(): setattr(varobj,k,v)

之后,键将成为 varobj 上的变量。

于 2013-07-19T20:47:41.867 回答
0

如果您正在寻找具有跨 python 版本的性能的优雅,那么遗憾的是,我认为您不会得到比以下更好的:

unpack = lambda a,b,c,**kw: (a,b,c) # static

d = dict( a=1, b=2, c=3, d=4, e=5 )

a,b,c = unpack(**d)

工作示例:

>>> unpack = lambda a,b,c,**kw: (a,b,c)
>>> d = dict( a=1, b=2, c=3, d=4, e=5, f=6, g=7 )
>>> a,b,c = unpack(**d)
>>> 
>>> unpack(**d)
(1, 2, 3)

您还可以解压缩否则将被丢弃的差异:

>>> unpackextra = lambda a,b,c,**kw: (a,b,c,kw)
>>> a,b,c,extra = unpackextra(**d)
>>> 
>>> unpackextra(**d)
(1, 2, 3, {'f': 6, 'd': 4, 'e': 5, 'g': 7})

参数是静态的,所以用例应该特定于你的意图。;)

>>> unpack2 = lambda a,b,c,d,e,f,**kw: (a,b,c,d,e,f) # static
>>> 
>>> unpack2(**d)
(1, 2, 3, 4, 5, 6)
>>> 
于 2019-06-23T02:40:04.580 回答
-1

优雅的解决方案:

d = { "foo": 123, "bar": 456, None: 789 }
foo, bar, baz = d.values()  # 123, 456, 789

请注意,没有使用键,因此请确保变量的顺序正确,即它们必须与键插入映射的顺序相匹配(从 Python 3.6 开始保证这种顺序)。如果对订购有疑问,请使用其他方法。

于 2019-06-06T14:02:07.337 回答