0

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

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'])
4

3 回答 3

2

一个中间变量可能比这个单行更可取(更具可读性):

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

(除了将中间值移动到动态生成的函数中之外,它实际上什么也没做)

于 2013-04-11T14:48:36.467 回答
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)

请注意,这种方法要求您将目标列表保持在排序的键顺序中,这对于应该简单明了的东西来说是一个奇怪的限制。

这比您的版本详细得多。它没有什么问题,真的。

于 2013-04-11T14:46:58.463 回答
1

不要那样做,在大多数情况下,中间 dict 是可以的。可读性很重要。如果你真的发现自己在这种情况下太频繁了,你可以使用装饰器来猴子补丁你的函数:

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,以便在调用时指定所需的字段,但我猜您需要一个包含这些机制的普通函数。

这将与上面的 def wrapper 的主体非常相似地实现,并且使用如下

one, three = getfromdict(func(), 'one', 'three' )

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

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

In     : two, three
Out    : (2, 3)
于 2013-04-11T15:21:21.307 回答