def foodColors():
"""Example function to return dictionary of food colors."""
appleColor = getAppleCol() # long magic function
return {'apple':appleColor, 'carrot':'orange', 'grape':'green'}
如果函数返回如上所示的字典,并且函数调用花费的时间比想要的长,那么将返回值分配给唯一变量的最佳方法是什么?例如,我的应用程序不关心胡萝卜色,也不知道如何实现foodColors()
。
我目前做的很明显:
colorDict = foodColors()
apple = colorDict['apple']
grape = colorDict['grape']
这种方法很好,但我希望有人可能有更好的解决方案,或者能够以独特的方式显示内联返回值,例如:
apple, grape = foodColors()['apple','grape'] # made up syntax
答案 0 :(得分:4)
您可以使用operator.itemgetter
:
apple, grape = itemgetter('apple', 'grape')(foodColors())
当然,如果您愿意,可以重新使用itemgetter功能:
getter = itemgetter('apple', 'grape')
apple, grape = getter(foodColors())
apple2, grape2 = getter(foodColors())
答案 1 :(得分:1)
可能(取决于你如何使用你的词典),namedtuples
也可以是一个解决方案:
from collections import namedtuple
color_dict = {'apple': 'red',
'carrot':'orange',
'grape':'green'}
# Create a namedtuple class
ColorMap = namedtuple('ColorMap', ['apple', 'carrot', 'grape'])
# Create an instance of ColorMap by using the unpacked dictionary
# as keyword arguments to the constructor
color_map = ColorMap(**color_dict)
# Unpack the namedtuple like you would a regular one
apple, carrot, grape = color_map
<强>优点强>
namedtuples
非常轻量级obj.attr
)<强>缺点强>
当然,如果namedtuples
符合条件,您可以完全跳过中间词典。
<强>背景强>
与您的玩具语法非常相似
apple, grape = foodColors()['apple','grape'] # made up syntax
几乎有效:
apple, grape = foodColors().values()
(仅获取dict中的值列表并像常规元组一样将其解压缩)。 这个问题是字典没有排序(它们的键/值对是任意顺序。不是随机的(根本不是),而是任意的,顺序会改变as the dictionary's size changes)。
然而,命名元组的字段是有序的(就像常规元组有一个顺序一样,在namedtuple
中它们只是名为字段)。所以在某种程度上,你可以获得字典的一些好处以及像元组这样的轻量级有序结构。这就是为什么他们可以解压缩到有序序列。
但是,如果你这样做,你依赖于元组中字段的确切顺序,因此放弃了它们提供的巨大优势之一。有关namedtuples
的更多内容以及为什么它们非常棒,请参阅Raymond Hettinger撰写的PyCon 2011: Fun with Python's Newer Tools。