设置 - 我有一个包含嵌套列表的列表(称之为中继集),如下所示:
relay_sets = [
[[80100, 'a']],
[[75000, 'b']],
[[64555, 'c']],
[[55000, 'd'], [44000, 'e']],
[[39000, 'f'], [2000, 'g']],
[[2000, 'h'], [999, 'i'], [999, 'j']],
[[999, 'k'], [999, 'l'], [343, 'm']]
]
用户被置于其中一个中继集(具有统一概率),然后再次以相等的概率使用子列表中的一个嵌套列表。因此,例如,用户有1/7的机会被放入[[80100, 'a']]
但是保证使用[80100, 'a']
,而用户有1/7的机会被放入[[55000, 'd'], [44000, 'e']]
并且然后有1/2的机会使用[55000, 'd']
。
我写了一个脚本,找到使用某个中继的概率:
def prob_using_relay(relay, relaysets):
prob1 = 1 / float(len(relaysets))
for index, item in enumerate(relaysets):
for i in item:
if relay in i:
num_relays_in_set = len(relaysets[index])
prob2 = 1 / float(num_relays_in_set)
total_prob = float(prob1 * prob2)
return total_prob
print prob_using_relay(80100, relay_sets) # gives correct answer of 0.142857142857
我的问题是我不知道如何解释重复项。因此,如果我想知道使用带有999带宽的中继的可能性,答案应该是(2/3 * 1/7 + 2/3 * 1/7)
,但我的脚本会给出1/21
。或者,如果我想知道使用2000带宽的中继的可能性,答案应该是(1/2 * 1/7 + 1/3 * 1/7)
而不是(1/2 * 1/7)
。
任何人都可以帮助改变我的功能以解决重复问题吗?
答案 0 :(得分:1)
您的代码存在很多问题。你正在对浮子进行无用的演员表演。另一个原因是它无法处理超过2级深度的概率。这是一个可以处理这个问题的递归方法:
relay_sets = [
[[80100, 'a']],
[[75000, 'b']],
[[64555, 'c']],
[[55000, 'd'], [44000, 'e']],
[[39000, 'f'], [2000, 'g']],
[[2000, 'h'], [999, 'i'], [999, 'j']],
[[999, 'k'], [999, 'l'], [343, 'm']]
]
def prob_using_relay(relay, relaysets):
if isinstance(relaysets[0], int):
return int(relaysets[0] == relay)
return sum(prob_using_relay(relay, relayset) for relayset in relaysets) / len(relaysets)
print(prob_using_relay(80100, relay_sets))
答案 1 :(得分:1)
def prob(bandwidth, relaysets):
answer = 0.0
for subl in relaysets:
answer += sum(1.0 for r in subl if r[0] == bandwidth)/len(subl)
return answer/len(relaysets)
输出:
In [44]: prob(999, relay_sets)
Out[44]: 0.19047619047619047
In [45]: 4/21
Out[45]: 0.19047619047619047
答案 2 :(得分:0)
此外,您可以使用分数:
from fractions import Fraction def prob_using_relay(relay, relaysets): prob = Fraction(0,1) for set in relaysets: if isinstance(set, list) and relay in set: prob += Fraction(1, len(relaysets)) elif isinstance(set, list): prob += Fraction(1, len(relaysets)) * prob_using_relay(relay, set) return prob prob_using_relay(999, relay_sets) Out: Fraction(4, 21)