如何从字典中获取任意值的元组?

时间:2013-04-11 14:45:23

标签: python dictionary key tuples

如何从匿名字典中获取任意值的元组?

def func():
    return dict(one=1, two=2, three=3)

# How can the following 2 lines be rewritten as a single line,
# eliminating the dict_ variable?
dict_ = func()
(one, three) = (dict_['one'], dict_['three'])

3 个答案:

答案 0 :(得分:2)

中间变量有什么问题?老实说,那是 WAY 比我为摆脱它而制造的这个丑陋的东西更好:

>>> (one,three) = (lambda d:(d['one'],d['three']))(func())

(除了将中间值移动到动态生成的函数之外,它什么都不做)

答案 1 :(得分:1)

循环func()结果?

one, three = [v for k, v in sorted(func().iteritems()) if k in {'one', 'three'}]

如果您使用的是Python 3,请将.iteritems()替换为.items()

演示:

>>> def func():
...     return dict(one=1, two=2, three=3)
... 
>>> one, three = [v for k,v in sorted(func().iteritems()) if k in {'one', 'three'}]
>>> one, three
(1, 3)

请注意,此方法要求您将目标列表保持在按顺序排列的顺序中,而不是对于应该简单明了的内容的奇怪限制。

这比您的版本更详细。它没有任何问题,真的。

答案 2 :(得分:1)

不要这样做,在大多数情况下,中间字典很好。 可读性很重要。 如果你真的在这种情况下经常发现自己,你可以使用装饰器对你的功能进行单一操作:

In     : from functools import wraps

In     : def dictgetter(func, *keys):
  .....:     @wraps(func)
  .....:     def wrapper(*args, **kwargs):
  .....:         tmp = func(*args, **kwargs)
  .....:         return [tmp[key] for key in keys]
  .....:     return wrapper

In     : def func():
   ....:         return dict(one=1, two=2, three=3)
   ....: 

In     : func2 = dictgetter(func, 'one', 'three')

In     : one, three = func2()

In     : one
Out    : 1

In     : three
Out    : 3

或类似的东西。

当然,你也可以monkeypatch,以便你在calltime上指定你想要的字段,但是你想要一个包含这些机制的普通函数,我猜。

这将与上面的def包装器的主体非常相似,并且像

一样使用
one, three = getfromdict(func(), 'one', 'three' )

或类似的东西,但你也可以重复使用上面的整个装饰:

In     : two, three = dictgetter(func, 'two', 'three')()

In     : two, three
Out    : (2, 3)