处理字典的“键或值”参数的正确方法是什么?

时间:2014-06-06 18:03:22

标签: python

假设我们有一个旨在促进数组使用的对象,并且有一些内部存储空间。

假设我们有一个应该做某事的方法。例如,您可能必须将其“提供”。我认为你可能只是想检查数据数组是否已经存在于内部存储器中是非常直观的,ELSE使用在调用函数时发送的数组。

我很好奇这样做的标准方法是

a)根本不要这样做,有不同的callables

b)尝试/除外或If / Else结构

c)dict.get(keyorarray, keyorarray)(这会尝试键,失败时返回对象)

示例:

class Spheres(object):

    def __init__(self):
        self._dict = dict()

    def volumes(self, radii='radii'):
        return (4/3) * math.pi * self._dict.get(radii, radii)**3

我的想法是我可以手动处理我的数组,在脚本的命名空间中跟踪它们,或者在某些情况下我可以将它们嵌入到对象中(即:spheres ['radii'] = radius) ,然后拨打spheres.volumes(spheres['radii'])spheres.volumes(),而不是拨打spheres.volumes(radii)

基本上我想提供选项,但如果用户在对象中存储了一堆向量,我想让算法“智能”并只使用他们已经拥有的数据。

2 个答案:

答案 0 :(得分:3)

我认为你想要的是defaultdict。这允许您指定一个默认的工厂可调用,如果dict中不存在某个键,它将返回(例如)一个新的空列表;否则,它将返回找到的值。

举个例子:

In [1]: from collections import defaultdict

In [2]: example = defaultdict(list)

In [3]: example['foo']
Out[3]: []

In [4]: example['foo'] += [1, 2, 3, 4, 5]

In [5]: example['foo']
Out[5]: [1, 2, 3, 4, 5]

In [6]: example['bar']
Out[6]: []

答案 1 :(得分:1)

我认为你问题的pythonic解决方案是:

class Spheres(object):

    def __init__(self):
       self._dict = dict()

    def volumes(self, radii=None):
        if radii is None: 
            radii = self._dict['radii']
        return (4/3) * math.pi *radii**3