<blockquote>
<p>the single output value should be probabilistically determined (fuzzy) based on a rule from keys eg:in above case rule could be if keys have both "red" and "blue" then return "baloon" 80% of time if only blue then return "toy" 15% of time else "car" 5% of time.</p>
</blockquote>
<p>请记住,您的案例分析并不完整,而且很模糊,但您可以“在精神上”做以下事情(充实所需的结果):</p>
<pre><code>import random
def randomly_return(*colors):
colors = set(*colors)
if 'red' in colors and 'blue' in colors:
if random.random() < 0.8: # 80 % of the time
return "baloon"
if 'blue' in colors and len(colors) == 1: # only blue in colors
if random.random() < 0.15:
return "toy"
else:
if random.random() < 0.05:
return "car"
# other cases to consider
</code></pre>
<hr/>
<p>我会把它作为一个函数,因为它是一个函数!但是如果您坚持让它像dict一样,那么python让您通过重写<code>__getitem__</code>(在我看来它不是python)来实现这一点。在</p>
^{pr2}$
<hr/>
<p>并希望通过OP获得澄清:</p>
<blockquote>
<p>randreturn((haseither(red,blue),baloon:0.8),((hasonly(blue),toy:0.15)),(default(),car:0.05)))</p>
</blockquote>
<p>要生成如下函数:</p>
<pre><code>funcs = {"haseither": lambda needles, haystack: any(n in haystack for n in needles),
"hasonly": lambda needles, haystack: len(needles) == 1 and needles[1] in haystack}
def make_random_return(crits, default):
def random_return(*colors):
colors = set(*colors)
for c in crits:
if funcs[c["func"]](c["args"], colors) and random.random() > c["with_prob"]:
return c["return_value"]
return default
return random_return
</code></pre>
<p>在这种情况下,临界值和默认值是:</p>
<pre><code>crit = [{"func": "haseither", "args": ("red", "blue"), "return_value": "baloon", "with_prob": 0.8}, ...]
default = "car" # ??
my_random_return = make_random_return(crits, default)
</code></pre>
<p>正如我所说,你的概率是模棱两可的/不加总的,所以你很可能需要调整一下。。。</em></p>
<p>可以通过在实例化时传递crit和default来扩展类定义:</p>
<pre><code>class RandomlyReturn(object):
def __init__(self, crit, default):
self.randomly_return = make_random_return(crit, default)
def __getitem__(self, *colors):
return self.randomly_return(*colors)
>>> r = RandomlyReturn(crit, default)
>>> r["red", "blue"] # 80% of the time it'll return "baloon"
"baloon"
</code></pre>