在Python中是否有像“无限字典”的东西?Python中是否有“无限字典”?
更准确地说,是有什么地方 - 我可以把价值观就像一本字典, - 但也许还告诉我如何映射一键的值, 功能 - 一个映射,或许也未尝一个(有限的)一组键的关键,然后给出相应的值? 以另一种方式表达,我想要的是下面的“东西”: 我以某种方式初始化它(给出值,函数,不管),然后它只是为每个键提供一个值(根据请求)。
在Python中是否有像“无限字典”的东西?Python中是否有“无限字典”?
更准确地说,是有什么地方 - 我可以把价值观就像一本字典, - 但也许还告诉我如何映射一键的值, 功能 - 一个映射,或许也未尝一个(有限的)一组键的关键,然后给出相应的值? 以另一种方式表达,我想要的是下面的“东西”: 我以某种方式初始化它(给出值,函数,不管),然后它只是为每个键提供一个值(根据请求)。
您将需要使用特殊方法__getitem__(self,key)
创建一个类,该类将为该密钥返回适当的值。
你需要什么叫做“功能”。
现在,在一个不太讽刺注:我不知道究竟你想达到什么样的,但这里有一个例子:
你想要的一段代码,返回第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
这可如果,例如,你需要保留状态的功能进行扩展。
希望这有助于
一个简单的方法来做到这一点是使用函数对象两个用例。如果你想使用键值函数,你可以直接使用它作为参考。为了使普通字典适应该界面,可以将其包装在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
我想你想是这样的,在那里你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
如果您想为现有的键不存在的键正常行为,和特殊的行为,还有的__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}
所以,如果我理解正确的这个,你想给字典中键,把它给你,你没有插入到字典中的价值? (你希望它从一个键生成一个值?) – Corbin 2012-03-21 20:35:22
你如何想象这种混合的特定值和自动生成的值工作?它是如何决定是使用特定的值还是调用哪个函数来产生一个值? – 2012-03-21 20:35:28
我有点困惑,你到底想要什么......为什么不用简单的字典呢?你有没有对python字典做过任何研究? – 2012-03-21 20:35:34