2012-03-21 61 views
0

在Python中是否有像“无限字典”的东西?Python中是否有“无限字典”?

更准确地说,是有什么地方 - 我可以把价值观就像一本字典, - 但也许还告诉我如何映射一键的值, 功能 - 一个映射,或许也未尝一个(有限的)一组键的关键,然后给出相应的值? 以另一种方式表达,我想要的是下面的“东西”: 我以某种方式初始化它(给出值,函数,不管),然后它只是为每个键提供一个值(根据请求)。

+0

所以,如果我理解正确的这个,你想给字典中键,把它给你,你没有插入到字典中的价值? (你希望它从一个键生成一个值?) – Corbin 2012-03-21 20:35:22

+0

你如何想象这种混合的特定值和自动生成的值工作?它是如何决定是使用特定的值还是调用哪个函数来产生一个值? – 2012-03-21 20:35:28

+0

我有点困惑,你到底想要什么......为什么不用简单的字典呢?你有没有对python字典做过任何研究? – 2012-03-21 20:35:34

回答

3

您将需要使用特殊方法__getitem__(self,key)创建一个类,该类将为该密钥返回适当的值。

4

你需要什么叫做“功能”。

现在,在一个不太讽刺注:我不知道究竟你想达到什么样的,但这里有一个例子:

你想要的一段代码,返回第n个元素在算术级数。你可以用函数这样来做:

def progression(first_element, ratio): 
    def nth_element(n): 
     return n*ratio + first_element 
    return nth_element 

my_progression = progression(2, 32) 
print my_progression(17) # prints 546 

这可如果,例如,你需要保留状态的功能进行扩展。

希望这有助于

1

一个简单的方法来做到这一点是使用函数对象两个用例。如果你想使用键值函数,你可以直接使用它作为参考。为了使普通字典适应该界面,可以将其包装在lambda block中。像这样:

# Use function as dictionary 
def dict_func(key): 
    return key * key 
dictionary = dict_func 
print dictionary(2) # prints 4 

# Use normal dictionary with the same interface 
normal_dict = {1: 1, 2: 4, 3: 9} 
dictionary = lambda(key): normal_dict[key] 
print dictionary(2) # also prints 4 

# Lambda functions store references to the variables they use, 
# so this works too: 
def fn_dict(normal_dict): 
    return lambda(key): normal_dict[key] 
dictionary = fn_dict({1: 1, 2: 4, 3: 9}) 
print dictionary(3) # prints 9 
1

我想你想是这样的,在那里你dict行为像一个正常的字典,而是特殊的键,你想改变的行为例如

class InfiniteDict(dict): 
    def __init__(self, *args, **kwargs): 
     self.key_funcs = kwargs.pop('key_funcs', []) 
     super(InfiniteDict, self).__init__(*args, **kwargs) 

    def __getitem__(self, key): 
     try: 
      return super(InfiniteDict, self).__getitem__(key) 
     except KeyError: 
      return self._get_value_from_functions(key) 

    def _get_value_from_functions(self, key): 
     """ 
     go thru list of user defined functions and return first match 
     """ 
     for key_func in self.key_funcs: 
      try: 
       return key_func(key) 
      except KeyError: 
       pass 

     raise KeyError(key) 

def double_even_int(key): 
    try: 
     if int(key)%2 == 0: 
      return int(key)*2 
     else: 
      raise KeyError(key) 
    except ValueError: 
     raise KeyError(key) 

def tripple_odd_int(key): 
    try: 
     if int(key)%2 == 1: 
      return int(key)*3 
     else: 
      raise KeyError(key) 
    except ValueError: 
     raise KeyError(key) 

inf = InfiniteDict(key_funcs=[double_even_int, tripple_odd_int]) 
inf['a'] = 'A' 

print inf['a'], inf[1], inf['2'] 

输出:

A 3 4 
2

如果您想为现有的键不存在的键正常行为,和特殊的行为,还有的__missing__方法就是所谓的丢失的钥匙。

class funny_dict(dict): 
    def __missing__(self, key): 
     return "funny" * key 

d = funny_dict() 
d[1] = "asdf" 
d[3] = 3.14 
for i in range(5): 
    print(i, d[i]) 

print(d) 

输出:

0 
1 asdf 
2 funnyfunny 
3 3.14 
4 funnyfunnyfunnyfunny 
{1: 'asdf', 3: 3.14}