如何从匿名字典中获取任意值的元组?
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'])
如何从匿名字典中获取任意值的元组?
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'])
一个中间变量可能比这个单行更可取(更具可读性):
>>> (one,three) = (lambda d:(d['one'],d['three']))(func())
(除了将中间值移动到动态生成的函数中之外,它实际上什么也没做)
循环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)
请注意,这种方法要求您将目标列表保持在排序的键顺序中,这对于应该简单明了的东西来说是一个奇怪的限制。
这比您的版本详细得多。它没有什么问题,真的。
不要那样做,在大多数情况下,中间 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)