我正在寻找一种优雅的方法,将Python字典中的某些值提取为本地值。
与此相当的东西,但对于更长的值列表以及更长的键/变量名称更清晰:
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')
但我一直怀疑还有其他内置方式。
答案 0 :(得分:25)
您可以执行类似
的操作foo, bar = map(d.get, ('foo', 'bar'))
或
foo, bar = itemgetter('foo', 'bar')(d)
这可能会节省一些打字,但基本上和你正在做的一样(这是一件好事)。
答案 1 :(得分:1)
有点可怕,但是:
globals().update((k, v) for k, v in d.iteritems() if k in ['foo', 'bar'])
请注意,尽管这是可能的 - 这是你真的不想做的事情,因为你将污染一个应该只留在dict
内部的命名空间......
答案 2 :(得分:1)
好吧,如果你提前知道这些名字,你可以按照你的建议去做。
如果你没有提前知道,那就坚持使用这个词 - 这就是他们的目的。
如果你坚持,另一种选择是:
varobj = object()
for k,v in d.iteritems(): setattr(varobj,k,v)
之后的键将是varobj上的变量。
答案 3 :(得分:1)
如果您要在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)
答案 4 :(得分:0)
优雅的解决方案:
d = { "foo": 123, "bar": 456, None: 789 }
foo, bar, baz = d.values() # 123, 456, 789
请注意,未使用键,因此请确保正确获取变量的顺序,即它们必须与将键插入映射中的顺序匹配(自Python 3.6起就保证了这种顺序)。如果对订购有疑问,请使用其他方法。