将返回字典中的值分配给唯一变量

时间:2013-12-02 18:14:25

标签: python dictionary

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

2 个答案:

答案 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 非常轻量级
  • Nice dotted attribute access(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